在 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
我正在尝试从包含大量记录的表中删除记录。
现在错误是
'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