【问题标题】:Dynamic cursor variable in DB2DB2 中的动态游标变量
【发布时间】:2021-08-17 21:15:10
【问题描述】:

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

    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 - 回滚成功完成。

【问题讨论】:

  • 首先在变量中添加一个冒号:prePare s1 from :stmt ;
  • db2中没有“动态游标变量”的意思。您在示例中从 SP 返回一个结果集,没有任何变量。还有另一种使用基于Cursor types 的结果集的技术,其中使用了游标变量。
  • @ThomasG 这是一个错误的建议。 Db2 SQL/PL 不支持这样的语法。
  • 请不要多次问同一个问题。 In Out Patameters In Dynamic Set DB2您可以编辑您的问题并添加其他信息(如果有)。

标签: db2


【解决方案1】:

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

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

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

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

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

要将结果集返回给调用者或客户端,请记住在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; 来使错误消息更加详细

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

【讨论】:

  • 请告诉我使用with return to callerwith return to client 的机会。我写declare c cursor with return to client for select * from aaa,部署时出错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2013-11-16
相关资源
最近更新 更多