無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

40.8. エラーとメッセージ

RAISE 文を使用してメッセージを報告し、エラーを発生することができます。

RAISE [
 

level

 
] '

format

' [
, 

expression

 [
, ... 
]
] [
 USING 

option

 = 

expression

 [
, ... 
] 
];
RAISE [
 

level

 
] 

condition_name

 [
 USING 

option

 = 

expression

 [
, ... 
] 
];
RAISE [
 

level

 
] SQLSTATE '

sqlstate

' [
 USING 

option

 = 

expression

 [
, ... 
] 
];
RAISE [
 

level

 
] USING 

option

 = 

expression

 [
, ... 
];
RAISE ;

level オプションはエラーの深刻度を指定します。 使用可能なレベルは DEBUG LOG INFO NOTICE WARNING および EXCEPTION で、 EXCEPTION がデフォルトです。 EXCEPTION はエラーを発生させ、現在のトランザクションをアボートします。 他のレベルは異なる優先度レベルのメッセージを生成するだけです。 特定の優先度のエラーメッセージがクライアントに報告するか、サーバログに書き込むか、またはその両方は log_min_messages および client_min_messages 設定変数によって制御されます。 詳細については、 第18章 を参照してください。

もしあれば level の後に format を記述することができます (これは評価式ではなく、単純文字列リテラルでなければなりません)。 書式文字列は報告されるエラーメッセージテキストを指定します。 書式文字列内では、 % は次の省略可能な引数の値の文字列表現で書き換えられます。 %% と記述することで % リテラルを表すことができます。

以下の例では、 v_job_id の値は文字列内の % を置き換えます。

RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;

USING に続いて、 option = expression 項目を記載することで、エラー報告に追加の情報を加えることができます。 それぞれの expression は任意の文字列で値付けされる式を取ることができます。 以下の option キーワードを使用できます。

MESSAGE

エラーメッセージテキストを設定します。 このオプションは USING の前に書式文字列を含む RAISE 形式では使用できません。

DETAIL

エラー詳細メッセージを出力します。

HINT

ヒントを出力します。

ERRCODE

付録A で示されている状況名、または直接的に5文字によるSQLSTATEコードのいずれかの報告すべきエラーコード(SQLSTATE)を指定します。

COLUMN
CONSTRAINT
DATATYPE
TABLE
SCHEMA

関連するオブジェクト名を提供します。

以下の例は、与えられたエラーメッセージとヒントを付けてトランザクションをアボートします。

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';

主引数が報告されるべき状況名、またはSQLSTATEである場合、2番目の RAISE 構文があります。 例を示します。

RAISE division_by_zero;
RAISE SQLSTATE '22012';

この構文において、 USING は独自のエラーメッセージ、詳細、またはヒントを供給するように使用できます。 先の例と同じことを行う別の方法は次のようになります。

RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;

他にも亜種があり、 RAISE USING または RAISE level USING と記述して、全て一括して USING リスト内に書き加えます。

最後の RAISE 亜種はパラメータを全く取りません。 この形式は BEGIN ブロックの EXCEPTION 句で使用されるのみです。 これは、現在処理中のエラーを再発生させます。

注意: PostgreSQL 9.1より前のバージョンでは、パラメータのない RAISE は稼動している例外ハンドラを含むブロックからのエラーの再発生と解釈されました。 したがって、例外ハンドラの中で入れ子となった EXCEPTION 句は、 RAISE が入れ子となった EXCEPTION 句のブロック内にあるときでも、エラーを捕捉できないことになりました。 これは驚くべきことであり、オラクルの PL/SQLと非互換でした。

RAISE EXCEPTION コマンド内で状況名もSQLSTATEも指定されない場合、デフォルトは RAISE_EXCEPTION ( P0001 )を使用します。 メッセージテキストが指定されない場合、デフォルトは状況名、またはSQLSTATEをメッセージテキストとして使用します。

注意: SQLSTATEコードでエラーコードを指定する場合、事前に定義されたエラーコードに制約されることはありません。 00000 以外の5桁の数字かASCIIの大文字からなるどんなエラーコードも選択できます。 3つのゼロで終わるエラーコードの出力を避けるように推奨されています。 と言うのは、そこには分類コードがあり、それらは全ての分類から捕捉することによってのみ補足可能だからです。


powered by SEO.CUG.NET