Oracle-11g-R2
在 sqlplus 中使用事務
我從 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
。)