14

いくつかの条件が満たされた場合、PostgreSQL SQL ステートメントからエラーを発生させる方法は?
以下のコードを試しましたが、エラーが発生しました。

CREATE OR REPLACE FUNCTION "exec"(text)
  RETURNS text AS
$BODY$ 
    BEGIN 
      EXECUTE $1; 
      RETURN $1; 
    END; 
$BODY$
  LANGUAGE plpgsql VOLATILE;

-- ERROR:  syntax error at or near "raise"
-- LINE 1: raise 'test' 

SELECT exec('raise ''test'' ') WHERE TRUE

実際のアプリケーションTRUEでは、いくつかの条件に置き換えられます。

アップデート

回答を拡張して、例外メッセージ パラメータを渡そうとしました。以下のコードを試しましたが、構文エラーが発生しました。メッセージパラメータを渡す方法は?

CREATE OR REPLACE FUNCTION exec(text, variadic ) 
  RETURNS void LANGUAGE plpgsql AS 
$BODY$  
BEGIN  
   RAISE EXCEPTION  $1, $2;  
END;  
$BODY$; 

SELECT exec('Exception Param1=% Param2=%', 'param1', 2 ); 
4

1 に答える 1

33

RAISEPL/pgSQL で(を使用して) 動的に呼び出すことはできません。これEXECUTEは SQL ステートメントに対してのみ機能しRAISE、PL/pgSQL コマンドです。

代わりに、この単純な関数を使用してください。

CREATE OR REPLACE FUNCTION f_raise(text)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   RAISE EXCEPTION '%', $1;
END
$func$;

電話:

SELECT f_raise('My message is empty!');

関連している:

コメントへの追加回答

CREATE OR REPLACE FUNCTION f_raise1(VARIADIC text[])
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN 
   RAISE EXCEPTION 'Reading % % %!', $1[1], $1[2], $1[3];
END
$func$;

電話:

SELECT f_raise1('the','manual','educates');
  • VARIADICはデータ型ではなく、引数 mode です

  • 要素は、他の配列要素と同様に処理する必要があります。

  • RAISEステートメントで複数の変数を使用する%には、メッセージ テキストに multiple を入力します。

$3noが渡された場合、上記の例は失敗します。可変数の入力要素から文字列を組み立てる必要があります。例:

CREATE OR REPLACE FUNCTION f_raise2(VARIADIC _arr text[]) 
  RETURNS void
  LANGUAGE plpgsql AS 
$func$  
DECLARE
   _msg text := array_to_string(_arr, ' and ');  -- simple string construction
BEGIN  
   RAISE EXCEPTION 'Reading %!', _msg;
END
$func$;

電話:

SELECT f_raise2('the','manual','educates');

VARIADICこれにはパラメーターがまったく必要ないと思います。ここでマニュアルを読んでください。
代わりに、すべてのパラメータを定義し、デフォルトを追加してください:

CREATE OR REPLACE FUNCTION f_raise3(_param1 text = ''
                                  , _param2 text = ''
                                  , _param3 text = 'educates')
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   RAISE EXCEPTION 'Reading % % %!', $1, $2, $3;
END 
$func$;

電話:

SELECT f_raise3('the','manual','educates');

または:

SELECT f_raise3();  -- defaults kick in
于 2012-08-11T23:16:39.463 に答える