スポンサーサイト

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

PL/pgSQLで文字列で時間を作成する

文字列で時間要素を与えて、timestamp型の値を返す関数を作ります。
まずは、引数チェックのための関数を二つ作ります。
・文字列が空かどうか判定する。

CREATE OR REPLACE FUNCTION is_set(
p_src text
) RETURNS boolean AS $$
DECLARE
BEGIN
RETURN p_src IS NOT NULL AND '' <> p_src;
END;
$$ LANGUAGE plpgsql;

・文字列が数値かどうか判定する。

CREATE OR REPLACE FUNCTION is_str_number(
p_src text
) RETURNS boolean AS $$
DECLARE
w_value bigint;
BEGIN
IF NOT is_set(p_src) THEN
RETURN FALSE;
END IF;
BEGIN
w_value := p_src::bigint;
RETURN TRUE;
EXCEPTION
WHEN invalid_text_representation THEN
RETURN FALSE;
END;
END;
$$ LANGUAGE plpgsql;

戻り値がbooleanの関数はwhere句で利用できます。条件のチェックが長くなったり、何度も利用されたりする場合関数にすると見やすくなります。
数値かどうか判定する関数では、例外を使ったサンプルにもなっています。
ちなみに、例外名が何になるのか、私もよくわからなかったので、
SELECT 'abc'::bigint;
みたいのを実行して、SQLステートを見て、PostgreSQLのマニュアルにあるPostgreSQLのエラーコードの中を探します。
最後に、文字列からtimestampを作る関数です。

CREATE OR REPLACE FUNCTION make_time(
p_year text DEFAULT '0001'
,p_month text DEFAULT '01'
,p_day text DEFAULT '01'
,p_hour text DEFAULT '00'
,p_minute text DEFAULT '00'
,p_second text DEFAULT '00'
,p_miri text DEFAULT '000000'
) RETURNS timestamp with time zone AS $$
DECLARE
BEGIN
IF is_str_number(p_year)
AND is_str_number(p_month)
AND is_str_number(p_day)
AND is_str_number(p_hour)
AND is_str_number(p_minute)
AND is_str_number(p_second)
AND is_str_number(p_miri)
THEN
RETURN p_year || '-' || p_month || '-' || p_day || ' ' || p_hour || ':' || p_minute || ':' || p_second || '.' || p_miri;
ELSE
RETURN NULL;
END IF;
END;
$$ LANGUAGE plpgsql;

8.4から導入された、引数のデフォルト値が便利に使えます。
これが無かったら一々、7つの引数を設定するか、7つの似たような関数を作るはめになってますから。

追記1 2009/09/25 07:58
時間を作るところでp_minuteを入れるのを忘れてました。修正しました。

追記2 2009/09/26 09:23
改訂版を作りました。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


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

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