2

何かに興味があります。値を更新し、それを削除してから新しい 1 を挿入するテーブルがあるとしましょう。そのような方法でコーディングを記述すれば、非常に簡単になります。

  UPDATE PS_EMAIL_ADDRESSES SET PREF_EMAIL_FLAG='N' WHERE EMPLID IN ('K0G004');

  DELETE  FROM PS_EMAIL_ADDRESSES WHERE EMPLID='K0G004' AND E_ADDR_TYPE='BUSN';

  INSERT INTO PS_EMAIL_ADDRESSES VALUES('K0G004', 'BUSN', 'ABS@GNC.COM.BZ', 'Y');

ただし、「update」ステートメントを使用すると、はるかに簡単になります。しかし、私の質問は、この3つのステップを同時に行うことは可能ですか?

4

3 に答える 3

3

Oracle Transaction Statements ドキュメントの引用:

トランザクションは、1 つ以上の SQL ステートメントを含む、論理的で原子的な作業単位です。トランザクションは、SQL ステートメントをグループ化して、それらがすべてコミットされる (データベースに適用されることを意味する) か、すべてロールバックされる (データベースから元に戻されることを意味する) ようにします。Oracle Databaseは、トランザクションIDと呼ばれる一意の識別子をすべてのトランザクションに割り当てます。

また、ウィキペディアのトランザクション投稿を引用します。

コンピューター サイエンスでは、ACID (Atomicity、Consistency、Isolation、Durability) は、データベース トランザクションが確実に処理されることを保証する一連のプロパティです。

原子性では、各トランザクションが「オール オア ナッシング」である必要があります。トランザクションの一部が失敗すると、トランザクション全体が失敗し、データベースの状態は変更されません。

あなたの場合、3 つの文すべてを 1 つのトランザクションで囲むことができます。

COMMIT;         ''This statement ends any existing transaction in the session.
SET TRANSACTION NAME 'my_crazy_update'; ''This statement begins a transaction 
                                         ''and names it sal_update (optional).
 UPDATE PS_EMAIL_ADDRESSES 
    SET PREF_EMAIL_FLAG='N' 
  WHERE EMPLID IN ('K0G004');

 DELETE FROM PS_EMAIL_ADDRESSES 
  WHERE EMPLID='K0G004' AND E_ADDR_TYPE='BUSN';

 INSERT INTO PS_EMAIL_ADDRESSES 
 VALUES('K0G004', 'BUSN', 'ABS@GNC.COM.BZ', 'Y');

COMMIT;

これは、 「一度にすべての文を実行する」という要件をキャッチするための最良のアプローチです。

于 2013-07-16T12:46:30.977 に答える
-1

ストアド プロシージャを作成して、必要なすべての操作を実行し、それを呼び出します。それは単一のステートメントです!

于 2013-07-15T07:52:08.463 に答える