PostgreSQL で無名ブロック(関数)を実行する


PostgreSQL で無名ブロック関数を使う

Oracle データベースでは無名ブロックという、ストアドプロシージャ等の関数を作成しなくても一連の処理のかたまりを実行する機能がありますが、 PostgreSQL にも同様の機能が存在します。"DO" という構文を使えば実現できます。




PostgreSQL の無名プロックの例

何よりもまず実際に動作する PostgreSQL の無名ブロックを見てみましょう。 この例は10回のループ処理中に1秒毎に数値を画面に出力する無名ブロックです。

"RAISE NOTICE" で画面にメッセージを表示するために最初に "SET client_min_messages TO notice;" というコマンドで メッセージ表示レベルを変更しています。
SET client_min_messages TO notice;

DO $$
DECLARE
  var_none text;
BEGIN
  FOR i IN 1..10 LOOP
    RAISE NOTICE '%', i;
    EXECUTE 'SELECT pg_sleep(1)';
  END LOOP;
END
$$
;


この無名ブロックを psql コマンドで実行すると次のようになります。

なお無名ブロックを実行すると最後に "DO" と表示されます。
NOTICE:  1
NOTICE:  2
NOTICE:  3
NOTICE:  4
NOTICE:  5
NOTICE:  6
NOTICE:  7
NOTICE:  8
NOTICE:  9
NOTICE:  10
DO

この DO 構文を使えば、一括してテーブルに GRANT で権限を与えたりすることが出来、 PL/PgSQL で関数を作るまでもない場合に非常に便利です。