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 对一个事务执行一个或多个语句?
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
。)