有没有办法在指定提交计数时执行INSERT INTO SELECT语句?

Scr*_*Dev 3 oracle oracle11g

DB:Oracle 11g

有没有办法做以下事情:

INSERT INTO T1
    (V1, V2)
COMMIT EVERY X
AS
SELECT (V1, V2) FROM T2;
Run Code Online (Sandbox Code Playgroud)

我知道如何循环游标,但我正在寻找更精简的东西.

PL/SQL很好,但没有循环.
使用SQL提示也很好.

如果这只是oracle无法处理的事情,那么悲伤就会随之而来(大多数情况下,我只是好奇,因为我已经有了另一种方法).

注意:该应用程序有数千亿条记录.每天创造数百万.INSERT INTO SELECT不适用于如此大的数据集.特别是当有大量的并行运行时.

Jus*_*ave 8

Oracle不允许声明进行临时提交,不允许.这样做会违反ACID数据库的基本属性.如果语句在第N行失败会怎么样?Oracle无法回滚先前提交的行.它不知道哪些行已处理,哪些行未处理.因此,您的声明将部分成功,您的数据库将处于未知状态.使用关系数据库的一个主要好处是避免产生这种结果.

你为什么要先做临时提交?这将使您的代码变慢并导致您使用更多资源.它会强制你编写一堆代码来使你的进程可以重新启动(即你必须跟踪哪些行已被处理,哪些没有,以便你可以回滚部分完成的更改或者如果失败则重新启动进程在中间).它会让您的代码更难以测试.进行临时提交几乎没有充分的理由.

  • @JensSchauder - Atomicity要求事务完全失败或完全成功.一致性要求事务将数据库从一个有效状态带到另一个有效状态.部分成功且部分失败的语句不会将数据库从一个有效状态转移到另一个有效状态,也不会是原子状态. (2认同)

Rob*_*ijk 5

Oracle不提供这样的SQL构造.使用带游标的PL/SQL和FORALL语句可以为你做...但是:

甲骨文没有提供这样的悲伤是件好事.Oracle是一个基于ACID原则的RDBMS.我代表隔离,在Oracle中,默认为READ COMMITTED.这意味着其他并发事务无法在中途看到您的事务.它可以防止其他会话看到不一致的数据.使用RDBMS的基石之一.

这带给我们最重要的问题:为什么你会想要这样的结构?

我希望不要害怕"大"交易.