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所带的各种工具包,还不清楚其提供了调试工具没有,不过编译错误相对好查找;至于业务流程的调试,可以采用一个比较笨的方法,就是创建一个调试表,在包体中各个流程点都插入一条记录,以观察程序执行流程。这也是一个比较方便的笨 办法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值