如何在Oracle SQL中使用事务?

Vor*_*ion 8 sql oracle transactions

我正在尝试在带有Oracle DB的SQL控制台上使用事务块。我习惯在PostgreSQL中使用转轴块

BEGIN;
<simple sql statement>
END;
Run Code Online (Sandbox Code Playgroud)

但是在oracle中看来这是不可能的。我总是收到“ ORA-00900”错误,而且我不知道该如何解决。如果我只使用像

<simple sql statement>
COMMIT;
Run Code Online (Sandbox Code Playgroud)

有用。但是是否没有一些标签来定义交易的开始?我试过了

START TRANSACTION;
<simple sql statement>
COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

kev*_*sky 9

您可以通过发出一条SQL语句来获得隐式事务块,如下所示:

<simple sql statement>
Commit;
Run Code Online (Sandbox Code Playgroud)

对于匿名块或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
Run Code Online (Sandbox Code Playgroud)


Hus*_*vik 1

正常情况下,读取已提交事务会自动从第一个修改的行开始。

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

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

或者

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