MySQL存储过程之创建第一个存储过程

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指令是一样的.

 

posted @ 2015-08-31 18:01  蒋启磊  阅读(739)  评论(0编辑  收藏  举报