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



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

现在错误是

'游标 C1 标识不是 SELECT 或 价值观'

1-添加了提交,不使用 COMMIT 的"事务日志"已满。 2-添加了 WITH HOLD 语句,使光标保持活动状态。

带有"--NEW ADD"的行显示新添加的代码到已经工作的删除中,没有提交和保留

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

请让我知道如何使用提交和保留删除

许多错误。
您不需要任何光标来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

最新更新