Copyright 2005, MySQL AB
翻译
:陈朋奕
(
西安电子科技大学
)
第
1
页
如有错误请来信
chenpengyi_007@163.com
,谢谢您的支持和阅读,同时感谢您对
MySQL
事业的关注
请转载时保留这些信息
MySQL 5.0 存储过程
存储过程存储过程
存储过程
MySQL 5.0 新特性系列 第一部分
MySQL 技术白皮书
技术白皮书技术白皮书
技术白皮书
Peter Gulutzan
March, 2005
翻译
:陈朋奕
西安电子科技大学
2005-5-6
(
声明:属于个人翻译,不涉及任何商业目的,支持国内
MySQL
发展,请转载时注明出处,谢谢)
(同时感谢
HuDu.Net
高级程序员
R.Wind Zhou
的大力支持帮助)
Copyright 2005, MySQL AB
翻译:陈朋奕
(
西安电子科技大学
)
第
2
页
如有错误请来信
chenpengyi_007@163.com
,谢谢您的支持和阅读,同时感谢您对
MySQL
事业的关注
请转载时保留这些信息
Table of Contents
目录
目录目录
目录(
目录不做翻译了,因为基本都是专有名词
)
Introduction ....................................................................................................3
A Definition and an Example ........................................................................3
Why Stored Procedures ................................................................................4
Why MySQL Statements are Legal in a Procedure Body...........................8
Characteristics Clauses ..............................................................................10
Parameters....................................................................................................13
The New SQL Statements ...........................................................................15
Scope ...........................................................................................................16
Loops.............................................................................................................21
Error Handling..............................................................................................29
Cursors .........................................................................................................35
Security .........................................................................................................41
Functions ......................................................................................................43
Metadata........................................................................................................44
Details ...........................................................................................................48
Style...............................................................................................................52
Tips when writing long routines.................................................................63
Bugs ..............................................................................................................64
Feature Requests .........................................................................................65
Resources .....................................................................................................65
Conclusion....................................................................................................66
About MySQL ...............................................................................................66
Copyright 2005, MySQL AB
翻译:陈朋奕
(
西安电子科技大学
)
第
3
页
如有错误请来信
chenpengyi_007@163.com
,谢谢您的支持和阅读,同时感谢您对
MySQL
事业的关注
请转载时保留这些信息
Introduction
本书是为需要了解
5.0
版本新特性的
MySQL
老用户而写的。简单的来说是介绍了“存储
过程、触发器、视图、信息架构视图”,这是介绍
MySQL 5.0
新特性丛书的第一集。希望这
本书能像内行专家那样与您进行对话,用简单的问题、例子让你学到需要的知识。
为了达到这样的目的
,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示
较大的实用用例,在学习之前也许大家会认为这个用例很难,但是只要跟着课程去学,相
信很
快就能掌握。
Conventions and Styles约定和编程风格
约定和编程风格约定和编程风格
约定和编程风格
每次我想要演示实际代码时,我会对
mysql
客户端的屏幕就出现的代码进行调整,将字体改成
Courier
,
使他们看起来与普通文本不一样。在这里举个例子:
mysql> DROP FUNCTION f;
Query OK, 0 rows affected (0.00 sec)
如果实例比较大,则需要在某些行和段落间加注释,同时我会用将“
<--
”符号放在页面
的右边以表示强调。例如:
mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* This procedure does nothing */ <--
-> END;//
Query OK, 0 rows affected (0.00 sec)
有时候我会将例子中的
"mysql>"
和
"->"
这些系统显示去掉,你可以直接将代码复制到
mysql
客户端程序中(如果你现在所读的不是电子版的,可以在
mysql.com
网站下载相关脚本)
所以的例子都已经在
Suse 9.2 Linux
、
Mysql 5.0.3
公共版上测试通过。在您阅读本书的时候,
Mysql
已经有更高的版本,同时能支持更多
OS
了,包括
Windows
,
Sparc
,
HP-UX
。因此这里的
例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深
Mysql
用户,以得到长久的支持和帮助。
A Definition and an Example 定义及实例
定义及实例定义及实例
定义及实例
存储过程是一种存储在书库库中的程序(就像正规语言里的子程序一样),准确的来说,
MySQL
支持的“
routines
(例程)”有两种:一是我们说的存储过程,
二是在其他
SQL
语句中
可以返回值的
函数
(使用起来和
Mysql
预装
载的
函数
一样,如
pi()
)。我在本书里面会更经常使用
存储过程,因为这是我们过去的习
惯
,相信大家也会接
受
。
Copyright 2005, MySQL AB
翻译:陈朋奕
(
西安电子科技大学
)
第
4
页
如有错误请来信
chenpengyi_007@163.com
,谢谢您的支持和阅读,同时感谢您对
MySQL
事业的关注
请转载时保留这些信息
一个存储过程包括
名
字,
参数列
表,以
及
可以包括很多
SQL
语句的
SQL
语句集。
在这里对
局部变量
,
异
常
处理
,
循环控
制和
IF
条件
句有新的语
法定义
。
下面是一个包括存储过程的实例
声明
:
(译注:为了
方便
阅读,此后的程序不
添任何
中文注释)
CREATE PROCEDURE procedure1 /* name
存储过程
名
*/
(IN parameter1 INTEGER) /* parameters
参数
*/
BEGIN /* start of block
语句
块头
*/
DECLARE variable1 CHAR(10); /* variables
变量声明
*/
IF parameter1 = 17 THEN /* start of IF IF
条件
开始
*/
SET variable1 = 'birds'; /* assignment
赋
值
*/
ELSE
SET variable1 = 'beasts'; /* assignment
赋
值
*/
END IF; /* end of IF IF
结束
*/
INSERT INTO table1 VALUES (variable1);/* statement SQL
语句
*/
END /* end of block
语句
块结束
*/
下面我将会介绍你可以
利
用存储过程
做
的
工作
的所有细节。同时我们将介绍新的
数据
库对
象——
触发器,因为触发器和存储过程的关
联
是
必
然的。
Why Stored Procedures 为什么要用存储过程
为什么要用存储过程为什么要用存储过程
为什么要用存储过程
由于
存储过程对
于
MySQL
来说是新的
功
能,很
自
然的在使用时你需要更加注
意
。
毕竟
,
在此之前
没
有
任何人
使用过,也
没
有很多大
量
的有经
验
的用户来
带
你
走
他们
走
过的
路
。然而你
应该
开始
考虑把
现有程序(可能在
服务
器
应
用程序中,
用户
自定义函数
(
UDF
)中,
或
是脚本中)
转移
到存储过程中来。这样
做
不需要
原
因,
你不得不去
做
。
因为
因为因为
因为存储过程是已经被认证的技术
存储过程是已经被认证的技术存储过程是已经被认证的技术
存储过程是已经被认证的技术!
!!
!
虽
然在
Mysql
中
它
是新的,但是相同
功
能的
函数
在其他
DBMS
中
早
已存在,而
它
们的语
法往往
是相同的。因此你可以从
其他
人
那里
获
得这些概念,也有很多你可以咨询
或者雇
用的经
验
用户,
还
有许多第
三方
的文
档
可
供
你阅读。
存储过程会使系统运行更快
存储过程会使系统运行更快存储过程会使系统运行更快
存储过程会使系统运行更快!
!!
!
虽
然我们
暂
时不能在
Mysql
上
证明
这个
优势
,用户得到的
体
验
也不一样。我们可以说的就是
Mysql
服务
器在
缓
存
机
制上
做
了改进,就像
Prepared
statements
(
预处理
语句)所
做
的那样。
由于没
有
编
译器,因此
SQL
存储过程不会像
外部
语言(如
C
)
编
写的程序运行起来那
么
快。但是
提升速度
的
主
要
方法却
在
于
能
否降
低
网
络
信息
流量
。如果你需要
处理
的是需要
检查
、
循环
、多语句但
没
有用户
交互
的
重
复性
任务
,你就可以使用
保
存在
服务
器上的存储过程来
完
成。这样在
执
行
任务
的每一
步
时
服务
器和客户端之间就
没
那
么
多的信息来
往
了。
所以存储过程是可复用的组件
所以存储过程是可复用的组件所以存储过程是可复用的组件
所以存储过程是可复用的组件!
!!
!
想
象
一下如果你改
变
了
主机
的语言,这对存储过程不会
产生影响
,因为
它
是
数据
库
逻辑
而不是
应
用程序。存储过程是可以
移植
的
!当
你用
SQL
编
写存储过程时,你就知
道它
可以运行在
Mysql
支持的
任何平台
上,不需要你
额外添
加
运行
环境
包,也不需要为程序在
操作
系统中
执
行
设置
许可,
或者
为你的不同
型
号的电脑
配置
不同的包。这就是与
Java
、
C
或
PHP
等外部
语言相比使用
SQL
语句的
优势
。不过,
使用
外部
语言例程的
好处还
是很
好
的
选择
,
它
们只是
没
有以上的
优点
而已。
Copyright 2005, MySQL AB
翻译:陈朋奕
(
西安电子科技大学
)
第
5
页
如有错误请来信
chenpengyi_007@163.com
,谢谢您的支持和阅读,同时感谢您对
MySQL
事业的关注
请转载时保留这些信息
存储过程将被保存
存储过程将被保存存储过程将被保存
存储过程将被保存!
!!
!
如果你
编
写
好
了一个程序,例如显示
银
行
事物处理
中的支
票撤消
,
那想要了解支
票
的
人
就可以
找
到你的程序。
它
会以
源
代码的
形式保
存在
数据
库中。这
将使
数据
和
处理数据
的进程有
意义
的关
联
这可能跟你在课上
听
到的规
划论
中说的一样。
存储过程可以迁移
存储过程可以迁移存储过程可以迁移
存储过程可以迁移!
!!
!
Mysql
完全
支持
SQL 2003
标
准。某些
数据
库(如
DB2
、
Mimer
)
同样支持。但也有
部分
不支持的,如
Oracle
、
SQL Server
不支持。我们将会给
予足够
帮助和
工具
,使为其他
DBMS
编
写的代码能更
容易转移
到
Mysql
上。
Setting up with MySQL 5.0 设置并开始
设置并开始设置并开始
设置并开始MySQL 5.0服务
服务服务
服务
通过
mysql_fix_privilege_tables
或者
~/mysql-5.0/scripts/mysql_install_db
来开始
MySQL
服务
作
为我们
练
习的准
备工作
的一
部分
,我
假定
MySQL 5.0
已经安
装
。如果
没
有
数据
库
管理员
为你安
装好数据
库以
及
其他
软件
,你就需要
自己
去安
装
了。不过你很
容易忘
掉一
件事
,
那就是你需要有一个
名
为
mysql.proc
的表。
在安
装
了最新版本后,你
必须
运行
mysql_fix_privilege_tables
或者
mysql_install_db
(只需要
运行其中一个就
够
了)
——
不然存储过程将不能
工作
。我同时
启
用在
root
身份
后运行一个
非
正
式
的
SQL
脚本,如下:
mysql>source/home/pgulutzan/mysql-
5.0/scripts/mysql_prepare_privilege_tables_for_5.sql
Starting the MySQL Client 启动
启动启动
启动MySQL客户端
客户端客户端
客户端
这是我
启动
mysql
客户端的
方式
。你也许会使用其他
方式
,如果你使用的是二进制版本
或者
是
Windows
系统的电脑,你可能会在其他子目
录
下运行以下程序:
pgulutzan@mysqlcom:~> /usr/local/mysql/bin/mysql --user=root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.3-alpha-debug
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
在演示中,我将会展示以
root
身份登陆
后的
mysql
客户端返回的
结
果,这样
意味
着我有
极
大的
特
权
。
Check for the Correct Version 核对版本
核对版本核对版本
核对版本
为了确认使用的
MySQL
的版本是正确的,我们要
查
询版本。我有两种
方法
确认我使用的
是
5.0
版本:
SHOW VARIABLES LIKE 'version';
or
SELECT VERSION();