RAISE文を使用してメッセージを報告し、エラーを発生することができます。
RAISE [level] 'format' [,expression[, ... ]] [ USINGoption{ = | := }expression[, ... ] ]; RAISE [level]condition_name[ USINGoption{ = | := }expression[, ... ] ]; RAISE [level] SQLSTATE 'sqlstate' [ USINGoption{ = | := }expression[, ... ] ]; RAISE [level] USINGoption{ = | := }expression[, ... ]; RAISE ;
levelオプションはエラーの深刻度を指定します。
使用可能なレベルはDEBUG、LOG、INFO、NOTICE、WARNINGおよびEXCEPTIONで、EXCEPTIONがデフォルトです。
EXCEPTIONはエラーを発生させ、現在のトランザクションをアボートします。
他のレベルは異なる優先度レベルのメッセージを生成するだけです。
特定の優先度のエラーメッセージがクライアントに報告するか、サーバログに書き込むか、またはその両方はlog_min_messagesおよびclient_min_messages設定変数によって制御されます。
詳細については、第19章を参照してください。
最初の構文の形式では、もしlevelがあればその後にformat文字列を記述します(これは評価式ではなく、単純な文字列リテラルでなければなりません)。
書式文字列は報告されるエラーメッセージテキストを指定します。
書式文字列の後には、メッセージに挿入される省略可能な引数の式を指定できます。
書式文字列内では、%は次の省略可能な引数の値の文字列表現で書き換えられます。
%%と記述することで%リテラルを表すことができます。
引数の数は書式文字列のプレースホルダ%の数と一致しなければいけません。さもなくば、関数のコンパイル時にエラーが起きます。
以下の例では、v_job_idの値は文字列内の%を置き換えます。
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
2番目と3番目の構文の形式では、condition_nameとsqlstateはそれぞれエラー条件名と5文字のSQLSTATEコードを指定します。
有効なエラー条件名と定義済みのSQLSTATEコードについては付録Aを参照してください。
以下は、condition_nameとsqlstateの使用方法の例です。
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
いずれの構文の形式でも、USINGの後にoption = expressionの項目を記述することで、エラー報告に追加の情報を加えることができます。
各expressionは、どのような文字列による式も可能です。
使用可能なoptionキーワードは以下です。
MESSAGE #エラーメッセージテキストを指定します。 このオプションは、既にメッセージが指定されている最初の構文の形式では使用できません。
DETAIL #エラー詳細メッセージを出力します。
HINT #ヒントメッセージを出力します。
ERRCODE #報告するエラーコード(SQLSTATE)を、付録Aで示されている条件名で指定するか、または5文字のSQLSTATEコードで直接指定します。 このオプションは、既にエラーコードが指定されている2番目と3番目の構文の形式では使用できません。
COLUMNCONSTRAINTDATATYPETABLESCHEMA #関連するオブジェクト名を出力します。
以下の例は、与えられたエラーメッセージとヒントを付けてトランザクションをアボートします。
RAISE EXCEPTION 'Nonexistent ID --> %', user_id
USING HINT = 'Please check your user ID';
以下の2つの例は、SQLSTATEを設定する等価な方法を示しています。
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation'; RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';
以下は、同じ結果になる別の方法です。
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
4番目の構文の形式で示されているように、RAISE USINGまたはRAISE と記述して、全て一括してlevel USINGUSINGリスト内に書き加えることも可能です。
最後のRAISE亜種はパラメータを全く取りません。
この形式はBEGINブロックのEXCEPTION句で使用されるのみです。
これは、現在処理中のエラーを再発生させます。
PostgreSQL 9.1より前のバージョンでは、パラメータのないRAISEは稼働している例外ハンドラを含むブロックからのエラーの再発生と解釈されました。
したがって、例外ハンドラの中で入れ子となったEXCEPTION句は、RAISEが入れ子となったEXCEPTION句のブロック内にあるときでも、エラーを捕捉できないことになりました。
これは驚くべきことであり、オラクルの PL/SQLと非互換でした。
RAISE EXCEPTIONコマンド内で状況名もSQLSTATEも指定されない場合、デフォルトはraise_exception (P0001)を使用します。
メッセージテキストが指定されない場合、デフォルトは状況名、またはSQLSTATEをメッセージテキストとして使用します。
SQLSTATEコードでエラーコードを指定する場合、事前に定義されたエラーコードに制約されることはありません。
00000以外の5桁の数字かASCIIの大文字からなるどんなエラーコードも選択できます。
3つのゼロで終わるエラーコードの出力を避けるように推奨されています。
と言うのは、そこには分類コードがあり、それらは全ての分類から捕捉することによってのみ補足可能だからです。
ASSERT文は、PL/pgSQL関数にデバッグ用検査を差し込むための便利な省略形です。
ASSERTcondition[ ,message];
conditionは常に真と評価されると想定される論理値式で、結果が真ならASSERT文がさらに何かすることはありません。
結果が偽かNULLなら、ASSERT_FAILURE例外が発生します。
(もし、conditionを評価する間にエラーが生じた場合、それは通常のエラーと同様に報告されます。)
省略可能なmessageが与えられた場合、その式の結果で(NULLでないなら)、conditionに失敗した際のデフォルトエラーメッセージ文「assertion failed」が置き換えられます。
message式はアサートに成功する通常の場合には評価されません。
アサート検査は、設定パラメータplpgsql.check_assertsで有効または無効にできます。設定値は真偽値で、デフォルトはonです。
offのときには、ASSERT文は何もしません。
ASSERTはプログラムのバグを見つけるためのものであって、通常のエラー条件を報告するものではないことに注意してください。
そのためには前述のRAISEを使ってください。