1. 选择分隔符
在开始创建工作之前,我们需要定义一个分隔符,SQL语句如为:
mysql> DELIMITER //
分隔符是你通知MySQL客户端你已完成一个sql语句的输入的字符或字符串符号,之前大多使用分号(;).由于在存储过程中,分号本身极有可能是存储过程本身的内容,基于这个原因,所以需要先定义一个其他的分隔符代替,定义完存储过程后可以通过以下语句恢复为分号:
mysql> DELIMITER ;
2. 创建程序实例
CREATE PROCEDURE p1() SELECT * FROM t;
1) CREATE PROCEDURE:表示创建存储过程的命令
2) p1:存储过程的名字
说明:存储过程命名不区分大小写,同一数据库内的存储过程命名不能重复(否则会导致重载,某些DBMS允许重载,如Oracle,但MySQL不允许).存储过程名可以分开,可以包括空格,长度限制64个字符,但不能使用MySQL的内建函数名.
3) ():括号里是参数列表,可以没有参数,但括号必需!
4) SELECT * FROM t;:存储过程的执行内容,此处只有一句代码.这是存储过程的主体,是一般的sql语句,除非语句后是结束符号,否则分号是必须的.
3. 可出现在存储过程体中的合法sql语句
一个存储过程体中可以包含,INSERT, UPDATE, DELETE, SELECT, DROP, CREATE, REPLACE 等等sql语句,但要注意的是如果代码中包含MySQL的扩充功能,则代码将不能移植.
# 标准sql语句中,任何数据库操纵语言都是合法的:CREATE PROCEDURE P() DELETE FROM t;# SET COMMIT及ROLLBACK也是合法的:CREATE PROCEDURE P() SET @x=5;# MySQL的附加功能:任何数据定义语言的命令也是合法的:CREATE PROCEDURE P() DROP TABLE t;# MySQL扩充功能:直接的SELECT也是合法的:CREATE PROCEDURE P() SELECT 'a';
之所以将存储过程中包括DDL语句的功能称为MySQL附加功能的原因是在sql标准中将这个定义为非核心的,即可选组件.
在过程体中有一个约束,就是不能有对全程或表操作的数据库操作语句,如:
CREATE PROCEDURE p1 () CREATE PROCEDURE p2 () DELETE FROM t;
以下语句对MySQL5.0来说都是全新的,不能出现在存储过程中:CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER. 不过你可以使用 "CREATE PROCEDURE db5.p1 () DROP DATABASE db5;",但是类似 "USE database" 语句也是非法的,因为MySQL假定默认数据库就是过程的工作场所。
4. 调用存储过程
1) 要调用一个存储过程,只要输入CALL跟一个存储过程的名字及一个括号:
CREATE PROCEDURE p1() SELECT * FROM t;# ... ...mysql> CALL p1()// #此处不是分号,原因见上
上述代码执行后屏幕返回t表的所有字段的所有记录.
2) 其他实现方式:
以下语句的执行效果相同:
mysql> CALL p1() // # ... ...mysql> SELECT * FROM t; //
所以调用存储过程和直接执行里面的sql指令是一样的.