コンテキストで例外を生成する


13

PostgreSQLが例外をスローすると、次のような行「CONTEXT」があります。

    ERROR:  INSERT has more target COLUMNS than expressions
    LINE 3: ...
                                                         ^
    QUERY:  INSERT INTO ...
    CONTEXT:  PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement

しかし、例外をスローすると、この行はありません。追加する方法が見つかりませんでした。

    RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla';

この行を例外に追加することはできますか?

回答:


13

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');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.