Sql oracle中的可配置自动提交

Sql oracle中的可配置自动提交,sql,oracle,Sql,Oracle,oracle中是否有用于自动提交的内置功能? 比如,如果我想更新一百万行,并且我想将自动提交设置为1000行或2000行,我只需要在某处配置if。 它将在每1000或2000行之后使用autocommit更新循环中的百万行。此功能在sqlloader中可用。我想知道oracle中是否也有类似的功能。语法 自动提交{ON | OFF} 描述 打开或关闭连接的自动提交模式。JDBC指定默认的自动提交模式为ON。某些类型的处理需要关闭自动提交模式。有关自动提交的信息,请参阅《JavaDB开发人员指南》

oracle中是否有用于自动提交的内置功能? 比如,如果我想更新一百万行,并且我想将自动提交设置为1000行或2000行,我只需要在某处配置if。 它将在每1000或2000行之后使用autocommit更新循环中的百万行。此功能在sqlloader中可用。我想知道oracle中是否也有类似的功能。

语法 自动提交{ON | OFF} 描述 打开或关闭连接的自动提交模式。JDBC指定默认的自动提交模式为ON。某些类型的处理需要关闭自动提交模式。有关自动提交的信息,请参阅《JavaDB开发人员指南》

如果有未完成的事务时自动提交模式从关闭更改为打开,则在当前事务提交时提交该工作,而不是在打开自动提交时提交。当存在未完成的事务时,请在启用自动提交之前使用提交或回滚,以便在返回到自动提交模式之前完成所有之前的工作

Example
ij> autocommit off;
ij> DROP TABLE menu;
0 rows inserted/updated/deleted 
ij> CREATE TABLE menu (course CHAR(10), item CHAR(20), price INT);
0 rows inserted/updated/deleted
ij> INSERT INTO menu VALUES ('entree', 'lamb chop', 14),
('dessert', 'creme brulee', 6), 
('appetizer', 'baby greens', 7); 
3 rows inserted/updated/deleted
ij> commit;
ij> autocommit on;
ij>

不可以。您不能要求Oracle以增量方式提交单个SQL语句正在执行的工作。这将违反ACID遵从性的原子性部分,因此关系数据库允许这样做是一件非常糟糕的事情。这样做意味着,如果数据库失败或语句在处理N行后失败,您将无法知道处理了哪N行。这样做意味着其他用户可能会看到部分完整的数据,导致他们的报告不正确,他们的查询可能会返回误导性结果


当然,您可以编写自己的自定义逻辑来批量更新行。然而,这通常是一个坏主意。运行正在进行临时提交的进程将需要更长的时间,可能需要更长的时间。它需要编写代码以确保过程是可重入的,也就是说,在服务器发生故障时,它可以从中断的位置重新开始,而无需尝试重新更新已更新和提交的行,或者至少不将数据更新为其他值。这将导致更新在服务器上生成更多的撤消和重做。它将要求使用数据的每个进程都知道它们可以在处理更新语句的过程中读取数据。它增加了ORA-01555错误的风险。一般来说,不需要临时提交—这样做的缺点非常非常不值得。

是的。你可以用它来做这件事

包显然是用来并行执行事情的,但它也会在每个块之后提交。您可以将块大小设置为1000或2000行,并将并行级别设置为0以串行运行

下面是一个简单的例子:

create table table1(a number);
insert into table1 select level from dual connect by level <= 100000;
commit;

begin
    dbms_parallel_execute.create_task('update_table1');

    dbms_parallel_execute.create_chunks_by_rowid(
        task_name => 'update_table1',
        table_owner => user,
        table_name => 'TABLE1',
        by_row => true,
        chunk_size => 1000
    );

    dbms_parallel_execute.run_task(
        task_name => 'update_table1',
        sql_stmt => 'update table1 set a = 5 where rowid between :start_id and :end_id',
        language_flag => dbms_sql.native,
        parallel_level => 0);
end;
/
尝试中途终止查询或会话。您只能看到提交了一些更改,并且可以使用dba_parallel_execute_chunks跟踪块状态


但是,我同意Justin Cave和Wolf的观点,即此功能几乎总是一个坏主意。

这并没有回答OP的问题。此外:ij不是Oracle命令行SQL工具,并且INSERT语句的语法对于Oracle也是错误的。请阅读@Justin的答案。很少需要在循环内提交,这会减慢更新速度,并导致比您试图解决的问题更多的问题。我将尝试此功能,并让您知道…这看起来很有希望此功能仅适用于11g…因为在生产机器上,我们只有oracle 10g:是否也有10g的替代方案?@subodh1989是,这是一个新的11g功能。我不知道10g有什么替代方案。