使用IBM DB2 LUW中的DB2存储过程内的Prepare语句执行动态删除查询的错误

时间:2019-06-06 14:09:16

标签: stored-procedures db2 commit db2-luw

我正在尝试从具有大量记录的表中删除记录。

现在错误是

  

'光标C1标识不是SELECT或   值”

1-添加了COMMIT,如果不使用COMMIT,则“事务日志”将变满。  2-添加了WITH HOLD语句以使Cursor保持活动状态。

带有'--NEW ADDED'的行将新添加的代码显示为已经工作的删除,而没有COMMIT和WITH HOLD

CREATE PROCEDURE
TABLE1.MYPROC1 ( IN A VARCHAR(100),IN B INTEGER,IN C INTEGER)
LANGUAGE SQL
BEGIN
DECLARE SQLCODE int;
DECLARE V_CREATE_QUERY VARCHAR(1024);
DECLARE V_DELETE_STATEMENT STATEMENT;
DECLARE C1 CURSOR WITH HOLD FOR V_DELETE_STATEMENT;--NEW ADDED

SET V_CREATE_QUERY='DELETE FROM (SELECT * FROM '||a||' WHERE KEY         
=='||RTRIM(CHAR(B)||' ' FETCH FIRST ' || RTRIM (CHAR(C)||' ROWS ONLY ) AS 
PURGE_TABLE';

PREPARE V_DELETE_STATEMENT FROM V_CREATE_QUERY;
OPEN C1;  --NEW ADDED
WHILE(SQLCODE <>1000)
 DO
 EXECUTE V_DELETE_STATEMENT;
 COMMIT;  --NEW ADDED
END WHILE;
CLOSE C1  --NEW ADDED
end

请让我知道如何使用COMMIT和WITH HOLD删除

1 个答案:

答案 0 :(得分:0)

许多错误。
delete不需要任何光标。
没有删除行时,将返回SQLCODE = 100(而不是1000)。您必须立即在相应的语句(在您的情况下为delete之后检查它,而不是在另一个语句(在您的示例中为commit ??之后)检查它。

应该是这样的:

CREATE OR REPLACE PROCEDURE
TABLE1.MYPROC1 ( IN A VARCHAR(100),IN B INTEGER,IN C INTEGER)
LANGUAGE SQL
BEGIN
  DECLARE SQLCODE int;
  DECLARE V_CREATE_QUERY VARCHAR(1024);
  DECLARE V_DELETE_STATEMENT STATEMENT;

  SET V_CREATE_QUERY=
    'DELETE FROM (SELECT * FROM '||a
  ||' WHERE KEY='||RTRIM(CHAR(B)
  ||' FETCH FIRST ' || RTRIM (CHAR(C)||' ROWS ONLY ) AS PURGE_TABLE';

  PREPARE V_DELETE_STATEMENT FROM V_CREATE_QUERY;
  DEL_LOOP: LOOP
    EXECUTE V_DELETE_STATEMENT;
    IF (SQLCODE = 100) THEN LEAVE DEL_LOOP; END IF;
    COMMIT;
  END LOOP DEL_LOOP;
  COMMIT;
end