PL/pgSQL に着手
DBサーバに複雑な処理をさせる必要性が全く浮かばないんで全然やったこと無かったけど、プロシージャがしがし使うことになったので開発環境を準備。
サンプル(実行すると1を返すファンクション)
CREATE OR REPLACE FUNCTION sample_f () RETURNS INTEGER AS ' DECLARE -- BEGIN -- return 1; END; ' LANGUAGE 'plpgsql';
登録してみる。
$ psql83 -f f1.sql -U postgres -d postgres ERROR: language "plpgsql" does not exist HINT: Use CREATE LANGUAGE to load the language into the database.
language "plpgsql"なんてねぇよと怒られた。
オフィシャルマニュアルで確認。何年ぶりに開いた、この本…
どうやらPL/pgSQLを使うデータベースでは createlang コマンドを実行してあげる必要があった。
実行してみる。
$ createlang plpgsql postgres -bash: createlang: command not found
見たことか、やっぱり Path が通ってない。
MacPorts で入れたから、/opt/local/lib/postgresql83/bin/ に入ってるんでした。
そうそう使うものでもないので、その場から実行。
ちなみに実行ユーザは PostgreSQL データベースの所有者じゃないといけないので、ユーザ名 postgres でやってる人は以下のようなコマンドになります。
$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/createlang plpgsql postgres'
今度こそ
$ psql83 -f f1.sql -U postgres -d postgres CREATE FUNCTION
おけ。
それでは早速ファンクションを実行してみよう!
$ psql83 -U postgres -d postgres postgres=# execute sample_f; ERROR: prepared statement "sample_f" does not exist STATEMENT: execute sample_f; ERROR: prepared statement "sample_f" does not exist
なん……だと?!
execute じゃなかったみたいorz
調べ直したら SELECT で良いんだって〜
postgres=# select sample_f(); sample_f ---------- 1 (1 row)