mysql 存储过程 游标学习总结
由于MySQL默认以";"为分隔符,则过程体的每一句都被MySQL以存储过程编译,则编译过程会报错;所以要事先用DELIMITER关键字申明当前段分隔符
一般使用delimiter //
用完了就把分隔符还原。恢复使用“;”(分号)作为分隔符,输入下面语句就可以了:
delimiter ; //[img][/img]
实例及说明
CREATE PROCEDURE p25 (OUT return_val INT)
/*创建存储过程,参数及类型的声明,由in,out inout可选*/
BEGIN???????????????????? /*存储过程体开始*/
DECLARE a,b INT;????????? /*变量声明*/
DECLARE cur_1 CURSOR FOR SELECT s1 FROM t;?????? /*游标声明*/
DECLARE CONTINUE HANDLER FOR NOT FOUND?????????? /*错误处理的声明*/
/*这三个变量的声明的顺序是不能颠倒的,首先事变量的声明,然后是条件声明,接着游标声明,最后声明错误处理器*/
SET b = 1;??????? /**/
OPEN cur_1;??????
/*存储过程执行的第一句,即存储过程从这里开始执行。过程将执行“SELECT s1 FROM t”,并返回一个结果集*/
REPEAT??????????? /*循环开始*/
FETCH cur_1 INTO a;
/*这里第一个FETCH语句会获得一行从SELECT产生的结果集中检索出来的值,然而表t中有多行,因此这个语句会被执行多次,当然这是因为语句在循环块内。*/
UNTIL b = 1
/*最后当MySQL的FETCH没有获得行时,CONTINUE处理被触发,将变量b赋值为1,而执行到这一句条件为真,循环结束*/
END REPEAT;
CLOSE cur_1;/*关闭游标*/
SET return_val = a;
/*这个例程中我们为输出参数指派了一个局部变量,这样在过程结束后的结果仍能使用。*/
END;//
执行存储过程
mysql> CALL p25(@return_val)//
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @return_val//
如果看到return_val参数获得了是表t的最后一行,游标工作正常,出错处理也工作正常。
执行顺序在附件中,自己的理解不对的还请多多指教
在开发过程中有几点要注意:
1、存储过程注释:MySQL支持采用--或者/**/注释,其中前者是行注释,后者是段式注释
2、变量首先用declare申明,其中临时变量可以直接以@前缀修饰以供引用
3、直接采用MySQL的Administrator管理器编辑时,可以直接采用如下函数文本录入;
?? 但若在脚本中自动导入存储过程或函数时,由于MySQL默认以";"为分隔符,则过程体的每一句都被MySQL以存储过程编译,则编译过程会报错;所以要事先用DELIMITER关键字申明当前段分隔符用完了就把分隔符还原。? 如下所示:
?????? DELIMITER //
?????? Stored Procedures and Functions
?????? DELIMITER ;
4、MySQL支持大量的内嵌函数,有些是和大型商用数据库如oracle、informix、sybase等一致,但也有些函数名称不一致,但功能一致;或者有些名称一致,但功能相异,这个特别对于从 这些数据库开发转过来的DBA要注意。
5、存储过程或函数的调试:我目前还没有研究MySQL所带的各种工具包,还不清楚其提供了调试工具没有,不过编译错误相对好查找;至于业务流程的调试,可以采用一个比较笨的方法,就是创建一个调试表,在包体中各个流程点都插入一条记录,以观察程序执行流程。这也是一个比较方便的笨 办法。
?