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

Errror executing dynamic delete query with Prepare statement inside a DB2 Stored Procedure in IBM DB2 LUW

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

现在错误是

'Cursor C1 identifies a prepared statement that is not a SELECT or VALUES'

1-添加了 COMMIT,在不使用 COMMIT 的情况下,'Transaction Logs' 已满。 2-添加了 WITH HOLD 语句以使 Cursor 保持活动状态。

带有“--NEW ADDED”的行显示新添加的代码到一个没有提交和保留的已经工作的删除

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 删除

一些错误。
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