動的SQL(2)


ITコーディネータのシュウです。
IMG_0294
きれいな白い渡り鳥?が川辺に止まっているのを偶然撮った写真です。シラサギでしょうか?
昔から、シラサギは縁起がいい鳥と言われているようで、ときに、田んぼにシラサギがいっぱいいるのを見たことがあって、ものすごく縁起がいい!と感動したことを覚えています。
シラサギは、汚い田んぼや河川には住まないとされていて、シラサギのいるところはきれいなところだといえるようですね。

<本日の題材>
動的SQL(Oracle)

今回は、前回に引き続いて動的SQLについての内容です。前回は動的なDDL文をEXECUTE IMMEDIATE文を使用して実行する例を取り上げましたが、今回は、動的なDML文を実行する例です。

例)対象レコードの件数を確認した後に、レコードを削除するSQLで、対象のテーブル名とWhereの条件文をパラメータとして渡すプロシージャ(動的なDML文)

CREATE OR REPLACE PROCEDURE del_table(tab_name VARCHAR2, clause VARCHAR2)
IS
Sql_stmt1 VARCHAR2(100);
Sql_stmt2 VARCHAR2(100);
V_COUNT NUMBER(4);

BEGIN
Sql_stmt1 := 'SELECT COUNT(*) FROM '||tab_name||' WHERE ' || clause;
DBMS_OUTPUT.PUT_LINE(Sql_stmt1);
EXECUTE IMMEDIATE Sql_stmt1 INTO V_COUNT;
DBMS_OUTPUT.PUT_LINE('件数は '||V_COUNT||' 件です');

Sql_stmt2 := 'DELETE FROM '||tab_name||' WHERE ' || clause;
DBMS_OUTPUT.PUT_LINE(Sql_stmt2);
EXECUTE IMMEDIATE Sql_stmt2;
COMMIT;
END;
/

※DBMS_OUTPUT パッケージは標準出力にメッセージを表示することができ、デバッグ目的などでよく使用されます。

受注テーブルのデータを指定した条件で削除します。
その前に、データを確認

SELECT * FROM 受注テーブル
ORDER BY 受注NO;
受注テーブル結果1

受注テーブルの定義は以下:
受注テーブル定義

プロシージャの実行
パラメータとして、'受注テーブル'、'受注日 = ''20141024''' を渡します。
('で囲む文字列の中に'(シングルクォーテーション)を含む場合には、'を2つ連続して記述する必要があります)

EXECUTE del_table('受注テーブル','受注日 = ''20141024''');
execute_del

処理の結果、受注テーブルを再度確認します。
SELECT * FROM 受注テーブル
ORDER BY 受注NO;
受注テーブル結果2

受注日が「20141024」のデータが削除され、delete文が実行されたことが確認できました。

パラメータのテーブル名、条件を別の値にすれば、異なるテーブルから異なる条件のデータを削除することができます。

今日は以上まで

にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>