mysql存储过程使用DECLARE定义游标遇到的问题

mysql存储过程使用DECLARE定义游标遇到的问题

话不多说,直接上SQL代码

DECLARE updateId CURSOR FOR (select custId from tempforreceipt where ISNULL(deliveryID)=1 or LENGTH(trim(deliveryID))=0);
	OPEN updateId; 	
  updateList: LOOP
	 FETCH updateId INTO custId2; 
	IF done = 1 THEN
		LEAVE updateList; 
	END IF; 
	  update tempforreceipt set `pid` = 0 where custId = custId2 and (ISNULL(deliveryID)=1 or LENGTH(trim(deliveryID))=0);
	  update tempforreceipt set `deliveryID` = i where custId = custId2 and (ISNULL(deliveryID)=1 or LENGTH(trim(deliveryID))=0);		
	  set i = i+1;
  END LOOP updateList;			
	CLOSE updateId; 

这个是我写的游标代码,没有任何问题。
但是报错存储过程的时候报错,如下:
在这里插入图片描述
报错1064,-You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DECLARE updateId CURSOR FOR (select custId from tempforreceipt where ISNULL(deli’ at line 43。

这样的错误也是无从下手,找了很多文章资料,原来在MySQL中,存储过程的所有关于数据库增删改查的操作必须在所有 declarre声明完所有变量 ,包括游标等 之后再执行,否则该存储过程将无法运行。

必须写在语句块的最前面,即出现在其他增删改查业务语句之前!!!!!

所以上面的代码只要把定义游标的语句提到整个语句块的最前面,或者说业务查询语句之前就正确了!

OPEN updateId; 	
  updateList: LOOP
	 FETCH updateId INTO custId2; 
	IF done = 1 THEN
		LEAVE updateList; 
	END IF; 
	  update tempforreceipt set `pid` = 0 where custId = custId2 and (ISNULL(deliveryID)=1 or LENGTH(trim(deliveryID))=0);
	  update tempforreceipt set `deliveryID` = i where custId = custId2 and (ISNULL(deliveryID)=1 or LENGTH(trim(deliveryID))=0);		
	  set i = i+1;
  END LOOP updateList;			
	CLOSE updateId; 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值