首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-01555:使用事务删除快照时太老的错误

ORA-01555:使用事务删除快照时太老的错误
EN

Stack Overflow用户
提问于 2022-08-08 07:07:40
回答 1查看 73关注 0票数 0

我希望有人能解释我为什么要和ORA-01555约会。我有一个函数和一个在一个大表中执行清理的过程:

代码语言:javascript
复制
-- 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;不阻止这一点?我能做些什么来阻止它呢?

EN

回答 1

Stack Overflow用户

发布于 2022-08-08 07:36:26

据我所知,ORA-01555的原因通常是在循环中提交--这正是您所要做的。

跳过函数(在其中执行DML通常是错误的),只使用过程。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73273999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档