sql - 如何在 oracle SQL 中使用事务?

标签 sql oracle transactions

我正在尝试在带有 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 DB。

最佳答案

您可以通过发出一条 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

关于sql - 如何在 oracle SQL 中使用事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178808/

相关文章:

mysql - 编写 SQL 更新语句

添加联接后 SQL 行消失

mysql - 在 MySQL 中选择并更新几行而不发生冲突

sql-server - SQL事务错误: The current transaction cannot be committed and cannot support operations that write to the log file

c# - 如何使用 payflow pro API 从存储的信用卡中扣款?

php - 如何在php中写出sql?

java - 如何从 Hibernate Criteria 对象中获取绑定(bind)参数?

java - 带有 PKI 的 Oracle

mysql - 查找结果集中某个字段是否有重复值

c++ - 如何在 Linux 中运行 OCI