DB2中的动态游标变量

DB2中的动态游标变量,db2,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 = 'sele

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

    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-已开始部署。 创建存储过程返回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 ;      
对于当前版本的DB2LUW,复合SQL块的这些规则如下所示

要将结果集返回给调用者或客户端,请记住在
声明c1游标
行中添加
返回调用者
返回客户端
,并在过程定义中添加
动态结果集1

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

您的jdbc驱动程序非常旧,因此计划将其升级到受支持的更好版本。您可以通过此网站下载最新版本

您还可以通过在连接字符串URL
中附加一个属性,使错误消息更加详细;retrieveMessagesFromServerOnGetMessage=true


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

首先在变量中添加冒号:
prePare s1 from:stmt在db2中没有“动态游标变量”这样的含义。在示例中,从SP返回一个结果集,不带任何变量。还有另一种使用基于的结果集的技术,其中使用了游标变量。@ThomasG这是一个错误的建议。这种语法在DB2SQL/PL中不受支持。请不要多次问同一个问题。如果您有问题,可以编辑您的问题并添加其他信息。请让我有机会将
与“返回给来电者”
与“返回给客户端”
一起使用。我编写
声明c游标并返回客户机,以便从aaa选择*
,部署时出错