我正在尝试在带有Oracle DB的SQL控制台上使用事务块。我曾经在PostgreSQL中使用过转移块,如
BEGIN;
<simple sql statement>
END;
但是在oracle中,似乎这是不可能的。我总是得到&#34; ORA-00900&#34;错误,我不知道如何解决这个问题。如果我只使用像
这样的SQL语句<simple sql statement>
COMMIT;
它有效。但是,是否有一些标签来定义交易的开始?我试过了
START TRANSACTION;
<simple sql statement>
COMMIT;
但它仍然会抛出一个ORA-00900。我的操作系统是windows,我使用的是IntelliJ IDEA和Oracle 11g DB。
答案 0 :(得分:6)
您可以通过发出一个SQL语句(
)来拥有隐式事务块<simple sql statement>
Commit;
对于匿名块或PL / SQL过程/函数/包,您可以在Postgres中看到更多选项。
如果您有多个声明必须全部成功或全部失败(atomic transaction,那么,从the documentation,您可以:
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 :(得分:0)
正常,读取已提交的事务,将自动启动第一个修改的行。
如果要明确设置事务,请使用:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
- 但是当第一行被修改时,事务将被物理创建,而不是在执行此语句时。
或
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
- 在这种情况下,读取一致性将从执行此命令开始。 READ ONLY
事务具有相同的读取一致性效果。