Oracle-11g-R2

在 sqlplus 中使用事務

  • May 15, 2015

我從 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=> 

我希望看到在送出交易之前我得到了預期的計數。

在 Oracle 命令行工具 sqlplus 中,情況並非如此。當我輸入“begin;”時,它只是開始讀取更多輸入,顯然從未做任何事情:

SQL> begin;
 2  update opacs_work_orders set customer_id = null;
 3  commit;
 4

如何使用 sqlplus 對事務執行一個或多個語句?

begin如果您只是要發出一系列 SQL 查詢,則根本不使用in sqlplus。只要您發出一些 SQL,您就已經在進行事務了。出於實際目的,無論如何您都不能真正處於事務之外(當然,如果您剛剛登錄,或者剛剛送出並且沒有開始其他任何事情,那麼您就沒有參與事務)​​。

不過有幾點需要注意:

  • sqlplus 確實有一個自動送出設置。在現代版本中預設情況下它是關閉的,但只是為了確保:
SQL> show autocommit
autocommit OFF

如果它恰好打開:

SQL> set autocommit off
  • 即使在現代版本中,sqlplus 也預設在退出時送出。要禁用它:
SQL> set exitcommit off

(這是相當新的,出現在 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

當你想執行一個 PL/SQL 塊時,你需要使用begin/ 。end(那個是短/單行形式exec。)

引用自:https://dba.stackexchange.com/questions/80665