MW211 EXIT

devlog
Oracle/ストアドプロシージャでの更新
2017年10月10日
(SQL Developerで)ストアドプロシージャを実行して、いきなり更新してしまうと、
WHERE句の誤記で大変なことになりかねない(全件更新とか)。

そこで、ワンクッションを置く方法。
┌──────────────────────────────────────┐
│CREATE OR REPLACE PROCEDURE "ストアドプロシージャ"                          │
│IS                                                                          │
│    "更新数" NUMBER := 0;                                                   │
│BEGIN                                                                       │
│    UPDATE "表"                                                             │
│        SET "列" = 値                                                       │
│        WHERE "キー" = 値;                                                  │
│    "更新数" := sql%rowcount;                                               │
│    DBMS_OUTPUT.PUT_LINE('更新件数=' || "更新数");                         │
│    RETURN;                                                                 │
│    EXCEPTION                                                               │
│        WHEN OTHERS THEN                                                    │
│            RETURN;                                                         │
│END;                                                                        │
│//                                        ※変数"更新数"を経由しなくてもよい│
└──────────────────────────────────────┘
  一、ストアドプロシージャ内では、「COMMIT」しない
  二、ストアドプロシージャ内で、更新結果を出力する
    二の一、更新件数は更新直後に「sql%rowcount」を参照すればよい
    二の二、更新結果は「DBMS_OUTPUT.PUT_LINE()」で出力すればよい

で、実行する側ではこうなる。
┌──────────────────────────────────────┐
│SET SERVEROUTPUT ON;                                                        │
│EXECUTE "ストアドプロシージャ";                                             │
├──────────────────────────────────────┤
│COMMIT;                                                                     │
└──────────────────────────────────────┘
  一、最初に「SET SERVEROUTPUT ON」を実行し、
      SQL Developerに「DBMS_OUTPUT.PUT_LINE()」の結果が出力されるようにする
      ┌──────────────────────────────────┐
      │更新件数=1                                                         │
      │PL/SQLプロシージャが正常に完了しました。                            │
      └──────────────────────────────────┘
  二、更新件数の妥当性を確認した上で、「COMMIT」する
      ┌──────────────────────────────────┐
      │コミットが完了しました。                                            │
      └──────────────────────────────────┘
くれぐれも、「COMMIT」忘れのなきよう。
分類:Oracle