DB2 中的动态游标变量

Dynamic cursor variable in DB2

我想打开一个动态游标变量。

    CREATE OR REPLACE PROCEDURE TTT ()

    P1: BEGIN
          Declare cID char(5) ;
          declare c1 cursor for s1 ;        
          declare stmt  varchar(1000) ;
   
          set cid = 'a' ;
         
          Set stmt = 'select * from aaa where a = ?' ;
          prePare s1 from stmt ;
   
   
          open c1 using cid ;

    END P1

我收到错误:

A.TTT - 部署开始。 创建存储过程 returns SQLCODE:-104,SQLSTATE:42601。 A.TTT:6:在“”之后发现了意外的标记“”。预期的标记可能包括:“”.. SQLCODE=-104、SQLSTATE=42601、DRIVER=3.69.56 在“”之后发现了一个意外的标记“”。预期的标记可能包括:“”.. SQLCODE=-104、SQLSTATE=42601、DRIVER=3.69.56 A.TTT - 部署失败。 A.TTT - 回滚成功完成。

错误的原因是代码忽略了复合-SQL 块中语句顺序的记录规则。

规则之一是游标声明必须出现在所有其他声明变量之后和 SQL PL 代码块开始之前。

所以在你的问题中,变量的顺序应该是:

  Declare cID char(5) ;
  declare stmt  varchar(1000) ;
  declare c1 cursor for s1 ;      

对于当前版本的 Db2-LUW,这些复合 SQL 块的规则是 here

要return调用者或客户端的结果集,记得在declare c1 cursor 行添加with return to callerwith return to client,同时添加dynamic result sets 1 在过程定义中。

要在存储过程代码中使用游标(即从中获取游标),则不需要这些东西。

您的 jdbc 驱动程序非常旧,因此计划将其升级到支持更好的版本。您可以通过此站点下载最新版本 https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads

您还可以通过将附加属性附加到连接字符串来使错误消息更加详细 URL ;retrieveMessagesFromServerOnGetMessage=true;

这可以加快您在学习时解决琐碎编程问题的能力。