mysql存储过程报错跟踪_存储过程 - longtengdama - 博客园

存储过程中可以用int 的1代表true,来做判断条件

/*mysqll过程*/

CREATE PROCEDURE `NewProcedure`(`Param` int(11))

BEGIN

DECLARE b INT default 0;

declare var_id,var_value varchar(20) default null;

DECLARE cur1 cursor

FOR

select testId from test2 ;

declare continue handler for not found set b=1;

open cur1;

repeat

fetch cur1 into var_id;

/*本身repeat util是do while的形式,会多执行一次,加上if not b then判断解决多循环一次的问题*/

/*把do while形式的循环改成while*/

if not b then

select var_id;

set var_value = concat('testName:',var_id);

/*insert into test values(var_id,var_value);*/

end if;

until b=1

end repeat;

close cur1;

END;

这是一个游标的使用例子.

但是其中有几点需要注意,就是为什么要加入 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;这样的一句话.

如果不加的话将直接报错.No data - zero rows fetched, selected, or processed

另外也有人提示过这样的经验:

经验之谈:

在MYSQL的存储过程一般要设个变量来跟踪是否NOT FOUND

DECLARE IS_FOUND INTEGER DEFAULT 1;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET IS_FOUND=0;

**

上面这行表示若没有数据返回,程序继续,并将变量IS_FOUND设为0

这种情况是出现在select XX into XXX from

tablename的时候发生的,这个时候如果XX是null就会有问题.其实也可以这样解决

select

isnull(xxxx,0) into aaaa from tableName

这样如果遇到null就为0了..

/*初始化*/

drop procedure

if exists

useCursor //

/*建立

存储过程 create */

CREATE

PROCEDURE useCursor()

BEGIN

/*局部变量的定义 declare*/

declare tmpName varchar(20) default

'' ;

declare

allName varchar(255) default

'' ;

declare cur1

CURSOR FOR

SELECT name FROM

test.level ;

/*

mysql 不知道为什么用异常加入判断 ?

*     此请参考官方文档 20.2.11.

光标 光标

*         这把 游标 异常后

捕捉

*         并设置 循环使用 变量 tmpname 为 null

跳出循环。

*/

declare

CONTINUE HANDLER FOR SQLSTATE

'02000'

SET tmpname =

null;

/*开游标*/

OPEN cur1;

/*游标向下走一步*/

FETCH cur1 INTO

tmpName;

/* 循环体

这很明显 把游标查询出的 name 都加起并用 ; 号隔开 */

WHILE (

tmpname is not

null) DO

set tmpName

= CONCAT(tmpName ,";") ;

set allName

= CONCAT(allName ,tmpName) ;

/*游标向下走一步*/

FETCH cur1 INTO

tmpName;

END WHILE;

CLOSE

cur1;

select allName ;

END;//

call useCursor()//

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值