【问题标题】:DB2 - Declare Cursor in Stored ProcedureDB2 - 在存储过程中声明游标
【发布时间】:2014-10-01 10:18:48
【问题描述】:

我在 WWW 上找到了这个“DECLARE CURSOR”声明:

CREATE OR REPLACE PROCEDURE "APART21C"."FIND_VALID_ARZTNRN"
(OUT NoOfRows BIGINT)
RESULT SETS 1
LANGUAGE SQL
SPECIFIC SQL140905135133600
BEGIN
  
  DECLARE myARZTNR CHAR(7);
  DECLARE END_TABLE INT DEFAULT 0
  ;
  DELETE FROM APART21C.TMP_LANR07_CHECK
  ;
  DECLARE C1 CURSOR FOR
  SELECT DISTINCT Arztnr 
  FROM APART21C.DMP_LEV_TMP
  ;
  DECLARE CONTINUE HANDLER FOR NOT FOUND
   SET END_TABLE = 1
  ;
  OPEN C1
  ;
  FETCH C1 INTO myARZTNR
  ;
  WHILE END_TABLE = 0 DO
  
        INSERT INTO APART21C.TMP_LANR07_CHECK
        SELECT * FROM TABLE(APART21C.CHECK_ARZTNR_BY_CHECKSUM(myARZTNR)) AS ARZTNRCHECK;
        SET NoOfRows = NoOfRows + 1;
        
        FETCH C1 INTO myARZTNR;
                
  END WHILE
  ;
  CLOSE C1
  ;
END

错误信息是

"DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=<cursor declaration>;;<SQL statement>"

需要你的帮助,请

我是 db2 的初学者,我在 MS SQL Server 方面有更多的经验。 语句“SELECT * FROM TABLE(...”调用了一个返回表的函数。

【问题讨论】:

  • 复合 SQL 中的所有DECLARE 语句必须出现在 任何可执行语句之前,例如DELETE。在您的 DB2 版本的手册中搜索“复合 SQL”。
  • 你的问题是什么?
  • @user2338816:问题是为什么会显示这个错误?(很容易猜到:)
  • @mustaccio:错误消失了,我也是。感谢您的快速帮助:)
  • 你还需要光标吗?为什么不把选择作为插入的一部分呢?你这样做的方式会消耗额外的开销,而没有真正的好处。

标签: stored-procedures cursor db2 db2-luw


【解决方案1】:

以下代码有问题

声明 C1 光标为 选择不同的 Arztnr FROM APART21C.DMP_LEV_TMP

我已更改如下并执行

用 HOLD FOR 声明 C1 光标 从 DMP_LEV_TMP 中选择 Arztnr;

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多