在 sqlplus 中使用事务

Way*_*rad 3 oracle-11g-r2 sqlplus transaction

我从 postgresql 来到 oracle。在 postgresql 中,我可以使用命令行工具 psql 在事务中执行删除或更新:

dbpool.production=> begin;
BEGIN
dbpool.production=*> delete from foo where account_id like '%1000%';
DELETE 9
dbpool.production=*> commit;
COMMIT
dbpool.production=> 
Run Code Online (Sandbox Code Playgroud)

我喜欢在提交事务之前看到我得到了预期的计数。

在 sqlplus(Oracle 命令行工具)中,事情并非如此。当我输入“开始;”时,它只是开始读取更多的输入,从不明显地做任何事情:

SQL> begin;
  2  update opacs_work_orders set customer_id = null;
  3  commit;
  4
Run Code Online (Sandbox Code Playgroud)

我如何使用 sqlplus 对一个事务执行一个或多个语句?

Mat*_*Mat 5

begin如果您只是要发出一系列 SQL 查询,则根本不要在 sqlplus 中使用。只要您发出一些 SQL,您就已经处于事务中。出于实际目的,您无论如何都不能真正处于事务之外(当然,如果您刚刚登录,或者刚刚提交但尚未启动任何其他操作,那么,您不在事务中)。

不过有几点需要注意:

  • sqlplus 确实有一个自动提交设置。它在现代版本中默认关闭,但只是为了确保:

    SQL> show autocommit
    autocommit OFF
    
    Run Code Online (Sandbox Code Playgroud)

    如果它恰好在:

    SQL> set autocommit off
    
    Run Code Online (Sandbox Code Playgroud)
  • 即使在现代版本中,sqlplus 默认情况下也会在退出时提交。要禁用它:

    SQL> set exitcommit off
    
    Run Code Online (Sandbox Code Playgroud)

    (这是相当新的,出现在 11g 或 11gR2 中。以前总是在退出时提交。)

  • DDL 提交。(两次。一次之前,一次之后。)请注意,这truncate是 Oracle 中的 DDL。

除了这些问题之外,当您启动 sqlplus 时,您已经处于事务中,并且可以随意提交或回滚。

$ sqlplus mat

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 20 19:51:31 2014
...
SQL> insert into abc values (1) ;

1 row created.

SQL> select count(*) from abc;

  COUNT(*)
----------
         1

SQL> rollback;

Rollback complete.

SQL> select count(*) from abc;

  COUNT(*)
----------
         0
Run Code Online (Sandbox Code Playgroud)

当您想要运行 PL/SQL 块时,您需要使用begin/ end。(那个是的短/单行形式exec。)