CONTEXT
ユーザー定義の例外を使用して行を直接出力する方法を見つけることができませんでした。このオプションは、PostgreSQL 9.1ではまだ実装されていません。こちらのマニュアルをお読みください。
しかし、私は見つけました...
回避策
...それは完璧に動作するはずです。エラーを発生させる別の関数を呼び出すことにより、plpgsqlを希望どおりに動作させることができます。これはPostgreSQL 9.0以降で機能します。
バージョン8.4では、微調整が必要です。パラメータを割り当てることはできません。
ユーザー定義のメッセージとCONTEXT
以下を含むエラー(警告、通知など)を発生させる関数:
CREATE OR REPLACE FUNCTION f_raise(_lvl text = 'EXCEPTION'
, _msg text = 'Default error msg.')
RETURNS void AS
$func$
BEGIN
CASE upper(_lvl)
WHEN 'EXCEPTION' THEN RAISE EXCEPTION '%', _msg;
WHEN 'WARNING' THEN RAISE WARNING '%', _msg;
WHEN 'NOTICE' THEN RAISE NOTICE '%', _msg;
WHEN 'DEBUG' THEN RAISE DEBUG '%', _msg;
WHEN 'LOG' THEN RAISE LOG '%', _msg;
WHEN 'INFO' THEN RAISE INFO '%', _msg;
ELSE RAISE EXCEPTION 'f_raise(): unexpected raise-level: "%"', _lvl;
END CASE;
END
$func$ LANGUAGE plpgsql;
COMMENT ON FUNCTION f_raise(text, text) IS 'Raise error or given level with msg and context.
Call from inside another function instead of raising an error directly
to get plpgsql to add CONTEXT (with line number) to error message.
$1 .. error level: EXCEPTION | WARNING | NOTICE | DEBUG | LOG | INFO
$2 .. error message';
関数を使用して、次のようなエラーを発生させます。
CREATE OR REPLACE FUNCTION test_err(text)
RETURNS void AS
$func$
BEGIN
-- do stuff
IF TRUE THEN -- some condition here?
-- instead of raising error like this:
-- RAISE EXCEPTION 'unexpected parameter: "%"', $1;
PERFORM f_raise('EXCEPTION', 'My message "' || $1 || '"');
END IF;
END
$func$ LANGUAGE plpgsql;
コール:
SELECT test_err('wrong parameter');
デフォルト値と名前付きパラメーター
構文を改善し、関数定義にデフォルト値を追加しました。パラメーターなし(または1つだけ)で呼び出すと、欠損値にデフォルトが使用されます。名前付きパラメーターとの組み合わせで、ほとんど何でもできます。例:
SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');