ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

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)