スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PL/pgSQLでTIMESTAMP型のデフォルト値の注意

PL/pgSQLでは引数にデフォルト値が設定できますが、TIMESTAMP型で現在時間を設定する時に書き方によっては想定しない動きをします。

CREATE OR REPLACE FUNCTION pl_test1(
p_now TIMESTAMP WITH TIME ZONE DEFAULT 'now'
) RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
return p_now;
END;
$$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION pl_test2(
p_now TIMESTAMP WITH TIME ZONE DEFAULT NOW()
) RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
return p_now;
END;
$$ LANGUAGE plpgsql;

この二つの違いはDEFAULT値の与え方です。
pl_test1が'now'、pl_test2がNOW()になっています。
まあ、動かしてもらえばわかりますが、pl_test2だけが期待した動きになります。
pl_test1は同じ値しか返しません。
どうも、'now'と書いた場合、登録した時に展開されて、登録時の時間固定になってしまっているようです。
ちなみにローカル変数としてDECLARE句で'now'を記述した場合は正しく動くようです。

CREATE OR REPLACE FUNCTION pl_test3(
) RETURNS TIMESTAMP WITH TIME ZONE AS $$
DECLARE
w_now TIMESTAMP WITH TIME ZONE := 'now';
BEGIN
return w_now;
END;
$$ LANGUAG

pl_test3は正しく動作します。

PostgreSQL 8.4.3で確認しました。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。