web-dev-qa-db-ja.com

Oracle SQLでトランザクションを使用するにはどうすればよいですか?

Oracle DBを備えたSQLコンソールでトランザクションブロックを使用しようとしています。私はPostgreSQLのtransaxctionブロックを使用するのに慣れています

BEGIN;
<simple sql statement>
END;

しかし、Oracleではこれは不可能のようです。常に「ORA-00900」エラーが発生し、それを修正する方法がわかりません。次のようなSQLステートメントを使用する場合

<simple sql statement>
COMMIT;

できます。しかし、トランザクションの開始を定義するタグはありませんか?私は試した

START TRANSACTION;
<simple sql statement>
COMMIT;

しかし、それでもORA-00900がスローされます。私のオペレーティングシステムはWindowsです。IntelliJIDEAとOracle 11g DBを使用しています。

10
Vortilion

次のように1つのSQLステートメントを発行して、暗黙的なトランザクションブロックを作成できます。

<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
9
kevinsky

通常、コミットされた読み取りトランザクションは、最初に変更された行から自動的に開始します。

トランザクションを明示的に設定する場合は、次を使用します。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED-ただし、このステートメントが実行されたときではなく、最初の行が変更されたときにトランザクションが物理的に作成されます。

または

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE-この場合、読み取りの整合性は、このコマンドが実行された時点のものになります。 READ ONLYトランザクションには、同じ読み取り一貫性の効果があります。

0
Husqvik