如何在Oracle SQL中使用事务(transaction)?

12

我正在尝试在具有Oracle DB的SQL控制台上使用事务块。我习惯于像PostgreSQL一样使用事务块

BEGIN;
<simple sql statement>
END;

但在Oracle中似乎不可能这样做。我总是遇到"ORA-00900"错误,不知道该如何解决。如果我只使用SQL语句,例如

<simple sql statement>
COMMIT;
START TRANSACTION;
<simple sql statement>
COMMIT;

但是它仍然抛出了ORA-00900错误。 我的操作系统是Windows,我正在使用IntelliJ IDEA和Oracle 11g数据库。


2
你不需要显式地启动一个事务,Oracle会为你跟踪它。但是,你需要提交或回滚你所做的工作。要执行BEGIN-END块,你需要在新行上输入反斜杠。如果之后仍然出现ORA-00900错误,则需要查看你的“简单SQL语句”的语法,因为Oracle语法可能与你习惯的略有不同。 - Michael Broughton
2个回答

12

通过像以下这样发出一个SQL语句,您可以拥有隐式的事务块:

```sql SQL statement; ```
<simple sql statement>
Commit;

对于匿名块或PL/SQL过程/函数/包,有更多选项可供选择,这些选项可能是您在Postgres中见过的。

如果您有多个语句必须全部成功或全部失败(原子事务),则可以根据文档中的说明执行以下操作:

原子性事务

文档
DECLARE
   <variable declaration>
BEGIN
   <simple sql statement>
   <simple sql statement>
   <simple sql statement>
   SAVEPOINT do_insert;
   <sql insert statement>
EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN
      ROLLBACK TO do_insert;
      DBMS_OUTPUT.PUT_LINE('Insert has been rolled back');
END;
--and commit outside the transaction

1

普通的、读取提交的事务会在第一行修改时自动启动。

如果您想显式设置事务,请使用:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED - 但是,事务将在第一行被修改时物理创建,而不是在执行此语句时创建。

或者

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - 在这种情况下,读一致性将按照执行此命令时的状态。 READ ONLY 事务具有相同的读一致性效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接