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