我希望有人能解释我为什么要和ORA-01555约会。我有一个函数和一个在一个大表中执行清理的过程:
-- Small cleanup in separate transaction.
FUNCTION clean_single(ts_until IN TIMESTAMP, datapoint_id IN NUMBER) RETURN NUMBER IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DELETE FROM VALUES WHERE DATAPOINT_ID = datapoint_id AND TS < ts_until;
COMMIT;
RETURN sql%rowcount;
END clean_single;
PROCEDURE prc_clean IS
count_all_deleted_vals NUMBER(10) := 0;
BEGIN
BEGIN
FOR dps IN (
SELECT x AS dpid, y as tsUntil FROM Z where some conditions
LOOP
count_all_deleted_vals := count_all_deleted_vals + clean_single(dps.tsUntil, dps.dpid);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Removed ' || count_all_deleted_vals || ' values');
END;
END prc_clean;这样做的目的是从作业中运行prc_clean(),在选择了相关的数据池id之后,在单个事务中完成每个数据池id的删除,以避免有一个巨大的事务。
但是当我运行这个程序时,它运行了一段时间,然后在ORA-01555中失败了。详细地说,我不明白为什么会发生这种情况。为什么函数中的PRAGMA AUTONOMOUS_TRANSACTION;不阻止这一点?我能做些什么来阻止它呢?
发布于 2022-08-08 07:36:26
据我所知,ORA-01555的原因通常是在循环中提交--这正是您所要做的。
跳过函数(在其中执行DML通常是错误的),只使用过程。
PROCEDURE prc_clean
IS
count_all_deleted_vals NUMBER (10) := 0;
BEGIN
FOR dps IN (SELECT x AS dpid, y AS tsUntil
FROM Z
WHERE some conditions)
LOOP
DELETE FROM VALUES
WHERE DATAPOINT_ID = dps.dpid
AND TS < dps.tsuntil;
count_all_deleted_vals := count_all_deleted_vals + SQL%ROWCOUNT;
END LOOP;
COMMIT;
DBMS_OUTPUT.PUT_LINE ('Removed ' || count_all_deleted_vals || ' values');
END;https://stackoverflow.com/questions/73273999
复制相似问题