DB2中的循环游标变量

DB2中的循环游标变量,db2,Db2,运行后,表bbb为空。如果正确,则表bbb有2行。因为查询从aaa中选择*,其中a='b'有2行。如果您的表包含多个列,则会得到SQLSTATE=01503。这是一个警告而不是异常,因此您的SP将继续执行。 使用“从中选择列名称…”。。。或者适当地修改SQLSTATE“00000”条件 注意:除非必要,否则不要在SP中使用commit。在这种情况下,这并不重要,但在调用应用程序管理事务时更好。不可复制。了解如何使用调试器在运行时单步执行代码并检查变量。如果光标未返回任何数据,将出现“未插入行”的

运行后,表bbb为空。如果正确,则表bbb有2行。因为查询从aaa中选择*,其中a='b'有2行。

如果您的表包含多个列,则会得到SQLSTATE=01503。这是一个警告而不是异常,因此您的SP将继续执行。 使用“从中选择列名称…”。。。或者适当地修改SQLSTATE“00000”条件


注意:除非必要,否则不要在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