首页 > 解决方案 > 从联接更新列失败

问题描述

我想根据表 2 和表 1 中另一列的比较,用表 1 中的列的数据更新表 2 中的列。

前任。:

在此处输入图像描述

我使用了这个脚本:

DECLARE

    TYPE dataRows_t IS TABLE OF table1.tagid%TYPE
    INDEX BY PLS_INTEGER;
    Tag   dataRows_t;
    tempTag dataRows_t;

BEGIN

    SELECT t1.tagid, t1.tagidB
    BULK COLLECT INTO Tag, tempTag
    FROM table1 t1;

    FORALL indx IN 1 .. Tag.COUNT
        UPDATE table2 t2
        SET t2.tagid = tag(indx)
        WHERE t2.tempTagIdB = temptag(indx);
    COMMIT;
END;

最多可以运行 40k 行(大约需要 3 分钟才能完成)

10 分钟后,我在 60k 的下一次尝试还没有完成。

我尝试了总共 89k 行 9 小时,但没有完成。

但是,当我取消脚本时,我可以看到值已正确更新,但脚本尚未完成。

我知道检查 89k 行的条件可能不是最有效的,但我没有找到更好的解决方案,我想它会在不到一小时的时间内完成。

我错过了什么?

标签: sqloraclejoinplsqlsql-update

解决方案


我会尝试合并:

MERGE INTO table2 t2
USING (SELECT tagid, tagidB from table1) t1
ON t2.tagidB = t1.tagidB
WHEN MATCHED THEN UPDATE SET
  t2.tagid = t1.tagid

关于您的评论“当我取消脚本时,我可以看到值已正确更新但脚本尚未完成。”。当您运行一个 PL/SQL 代码块时,整个块被发送到 DB 服务器并在那里执行。如果您取消客户端程序中的操作,则不会取消数据库中代码块的执行。您的观察表明它最终完成了执行并提交了更改(因为您的代码块包含提交)。如果您在 PL/SQL 块中没有提交,当它检测到客户端会话消失时,它会在完成后回滚。


推荐阅读