DB2中的循环游标变量
运行后,表bbb为空。如果正确,则表bbb有2行。因为查询从aaa中选择*,其中a='b'有2行。如果您的表包含多个列,则会得到SQLSTATE=01503。这是一个警告而不是异常,因此您的SP将继续执行。 使用“从中选择列名称…”。。。或者适当地修改SQLSTATE“00000”条件DB2中的循环游标变量,db2,Db2,运行后,表bbb为空。如果正确,则表bbb有2行。因为查询从aaa中选择*,其中a='b'有2行。如果您的表包含多个列,则会得到SQLSTATE=01503。这是一个警告而不是异常,因此您的SP将继续执行。 使用“从中选择列名称…”。。。或者适当地修改SQLSTATE“00000”条件 注意:除非必要,否则不要在SP中使用commit。在这种情况下,这并不重要,但在调用应用程序管理事务时更好。不可复制。了解如何使用调试器在运行时单步执行代码并检查变量。如果光标未返回任何数据,将出现“未插入行”的
注意:除非必要,否则不要在SP中使用commit。在这种情况下,这并不重要,但在调用应用程序管理事务时更好。不可复制。了解如何使用调试器在运行时单步执行代码并检查变量。如果光标未返回任何数据,将出现“未插入行”的症状。除非您能够进行调试,否则情况并非如此。如果AAA中有多个列,并且您真的有一个select*,那么可能在获取后sqlstate值为01503,这意味着您必须仅选择所需的列,并仅在SQLSTATE=02000时离开。请参见为什么在scrip运行时它不显示错误SQLSTATE。没有理由在此处使用光标。您可以直接插入select语句的结果。插入bbb aa中,从aaa中选择“3”concat列_name,其中a=cid;
CREATE OR REPLACE PROCEDURE qqq ()
P1: BEGIN
Declare cID char(5) ;
Declare cc char(5) ;
Declare SQLSTATE char(5) default '00000' ;
declare stmt varchar(1000) ;
declare c1 cursor for s1 ;
set cid = 'b' ;
Set stmt = 'select * from aaa where a = ?' ;
prePare s1 from stmt ;
open c1 using cid ;
ins_loop :
Loop
fetch c1 into cc ;
if SQLSTATE <> '00000' then LEAVE ins_loop ; end if ;
insert into bbb (aa) values ('3' || cc) ;
end loop ins_loop;
close c1 ;
commit ;
END P1