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
发展,请转载时注明出处,谢谢)
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();