【问题标题】:THE CURSOR CURSOR NAME IS NOT IN A PREPARED STATE光标光标名称未处于准备状态
【发布时间】:2020-06-09 17:49:52
【问题描述】:

我为选择创建了动态存储过程。我将通过传递参数使用这个通用查询来执行多个选择语句。

DECLARE DESC_CSR CURSOR WITH HOLD FOR V_SQL; 

SET V_SELECT =                               
'SELECT ' || SELECT_FIELDS ||                
' FROM '  || TABLE_NAME    ||                
' WHERE ' || WHERE_CLAUSE  ||                
' WITH UR';                                  

PREPARE V_SQL FROM V_SELECT;  
OPEN DESC_CSR;   

我将传递以下值。

SELECT_FIELDS = B.COLUMN_A  INTO HOST_VAR_A
TABLE_NAME =  TABLE_A A   INNER JOIN TABLE_B B      
              ON A.ROW_ID = B.ROW_ID
WHERE_CLAUSE = A.COLUMN_B = HOST_VAR_B

当我这样做时,我得到“CURSOR DESC_CSR 未处于准备状态”。

如果我做错了,任何人都可以帮助我如何准备或纠正我。

【问题讨论】:

  • 你只显示了你的 sproc 的一部分,但还不够。显示您的相关异常处理程序。在准备之前显示 exact 查询。按照您的平台(z/os、i-series、linux/unix/windows)的 Db2 知识中心中记录的 SQL0514N 说明进行操作。
  • @mao 感谢您的回复。下面将是我在 PREPARE 中的查询。看起来 CURSOR 不喜欢,因为我使用的是 INTO。 SELECT B.COLUMN_A INTO HOST_VAR_A FROM TABLE_A A INNER JOIN TABLE_B B ON A.ROW_ID = B.ROW_ID WHERE = A.COLUMN_B = HOST_VAR_B
  • 您尚未提供异常处理程序代码或 Db2-server 平台/版本详细信息。不要使用 cmets 添加新事实(它们会丢失),而是 EDIT 您的问题以添加新事实。除非 SELECT_FIELDS 包含 into 子句,否则您的代码示例无法生成该查询。
  • 另外,如果你有游标,为什么还要有 INTO 子句?单例选择不需要光标。
  • 我尝试了不带 CURSOR 的 SELECT,例如 SET V_SELECT = 'SELECT ' || SELECT_FIELDS || ' FROM ' || TABLE_NAME || ' WHERE ' || WHERE_CLAUSE; || EXECUTE IMMEDIATE V_SELECT; ,当将 SELECT_FIELDS 作为 COLUMN_A 传递到 HOST_VAR_A 时,我得到了 INTO CLAUSE IS NOT PERMITTED。

标签: stored-procedures dynamic db2 cobol


【解决方案1】:

我使用了下面的代码,它工作正常。我能够使用 Dynamic 运行多个选择。

DECLARE DESC_CSR CURSOR WITH HOLD FOR V_SQL;  

  SET V_SELECT =                              
  'SELECT ' || SELECT_FIELDS ||               
  ' FROM '  || TABLE_NAME    ||               
  ' WHERE ' || WHERE_CLAUSE  ||               
  ' WITH UR';                                 


  PREPARE V_SQL FROM V_SELECT;  

  OPEN DESC_CSR USING HOST_VAR_B;

  FETCH DESC_CSR INTO HOST_VAR_A;

我通过 parm 如下。使用 where 子句 HOST_VAR_B 作为参数标记“?”并在 OPEN 处分配字段。

SELECT_FIELDS = B.COLUMN_A  INTO HOST_VAR_A
TABLE_NAME =  TABLE_A A   INNER JOIN TABLE_B B      
              ON A.ROW_ID = B.ROW_ID
WHERE_CLAUSE = A.COLUMN_B = ?

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多