目的
SQLSTATEコードにニーモニック(略号)名を割当てるか、ユーザー定義条件を宣言します。
呼び出し
実行可能な制御宣言。
ストアド プロシージャのみ。
構文
説明
- condition_name
- SQLSTATEコードに関連付けられたニーモニック(略号)名。SQLSTATE値を指定しないと、条件名を使用してユーザー定義条件を宣言します。
- sqlstate_code
- 処理する5文字リテラルのSQLSTATEコード。
ANSI準拠
DECLARE CONDITIONは、ANSI/ISO SQL:2011に準拠しています。
許可
なし。
使用上の注意
DECLARE CONDITION文により、条件に対するシンボリック名を宣言し、オプションとして特定のSQLSTATE値にそれを関連付けることができます。これで、SQLSTATE値がどのような条件を表わすのか簡単に想起できます。
使用可能なSQLSTATE値で表わされる条件が自分のニーズに合わない場合、自分のストアド プロシージャ固有のカスタム条件を定義することができます。
ユーザー定義条件を宣言するには、条件宣言ではSQLSTATE値を割当てずに条件名を宣言するだけです。この場合、Teradata Databaseはcondition_nameをユーザー定義条件として扱います。SIGNAL文に条件名を付けて使用すると、明示的にユーザー定義条件を発生させることができます。
ルール
- 条件名は有効な識別子でなければなりません。名前は、ローカル変数、パラメータ、FORループの別名/列、またはストアド プロシージャで宣言されたラベル名にすることができます。
- オプションとして、条件名をSQLSTATE値に関連付けることができます。例えば、条件名divide_by_zeroをSQLSTATE値'22012'に関連付けることができます。
- 同じ条件名を、別の入れ子または入れ子ではない複合文で宣言できます。それぞれの複合文内で、その条件名を同じSQLSTATE値に割当てたり、別のSQLSTATE値に割当てたりできます。複合文の有効範囲設定ルールにより、それぞれの宣言で別の条件を定義することができます。
- 同じ複合文内で同じ条件名を複数回宣言することはできません。そのような指定をすると、ストアド プロシージャのコンパイル中にエラーSPL1080が報告され、そのストアド プロシージャは作成されません。
- 条件と変数の宣言は、複合文内で他のタイプの宣言を行なう前に行なう必要があります。
- 同じ複合文内で同じSQLSTATE値に関連付けた1つ以上の条件名を宣言することはできません。そのような指定をすると、ストアド プロシージャのコンパイル中にエラーSPL1081が報告され、そのストアド プロシージャは作成されません。
- SQLSTATE値に対して定義されたハンドラーは、そのSQLSTATE値に関連付けられた明示的に宣言された条件も処理できます。
例: ローカル変数、条件、および別名に対する同じ名前の使用
- divide_by_zeroは、変数および条件名として使用される。
- IOParam1は、パラメータおよび条件名として使用される。
- cs1は、ラベル名および条件名として使用される。
CREATE PROCEDURE dec1(INOUT IOParam1 INTEGER) cs1: BEGIN DECLARE divide_by_zero INTEGER; DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012'; DECLARE IOParam1 CONDITION; DECLARE cs1 CONDITION; DECLARE alias1 CONDITION; FOR rp1 AS c_rp1 CURSOR FOR SELECT c1 AS alias1 FROM tab1 DO SET IOParam1 = rp1.alias1; END FOR; ... END cs1;
例: 入れ子の複合文での条件名の使用
次の例は、複合文内でのさまざまな条件名の使用法を示しています。条件宣言は、同じ条件名divide_by_zeroを定義していますが、宣言は別の複合文内で行われ、同じまたは異なる条件をそれぞれの複合文内で定義しています。
CREATE PROCEDURE dec2() cs1: BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012'; cs2: BEGIN DECLARE divide_by_zero CONDITION; cs3: BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012'; ... END cs3; cs4: BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '42000'; ... END cs4; ... END cs2; ... END cs1;
例: 複合文内での条件名
次の例は、複合文内での条件名の有効範囲を示しています。
ストアド プロシージャの実行中、行3で宣言されている条件名exception_condの有効範囲は、複合文cs1およびcs2です。行7で宣言されているexception_condの有効範囲はcs2です。cs2でのexception_condの宣言により、cs1でのexception_condの定義が上書きされます。
行10のINSERT文により、例外ERRTEQTVNOEXIST (SQLCODE 3807およびSQLSTATE '42000')が発生します。CONTINUEハンドラは、cs2でSQLSTATE '42000'に関連付けられているexception_condを処理するよう定義されているので、この(行8で宣言されている)ハンドラーが呼び出されます。
行13のINSERT文でも、例外ERRTEQTVNOEXISTが発生します。しかし、cs1(INSERT文の外側にある複合文)ではSQLSTATE '42000'を処理するよう宣言されたハンドラーがないので、ストアド プロシージャは例外ERRTEQTVNOEXIST (SQLCODE 3807およびSQLSTATE '42000')で終了します。
1. CREATE PROCEDURE dec3() 2. cs1: BEGIN 3. DECLARE exception_cond CONDITION FOR SQLSTATE VALUE '22012'; 4. DECLARE CONTINUE HANDLER FOR exception_cond 5. ... 6. cs2: BEGIN 7. DECLARE exception_cond CONDITION FOR SQLSTATE VALUE '42000'; 8. DECLARE CONTINUE HANDLER FOR exception_cond 9. ... 10. INSERT INTO Tab1 VALUES (10); -- Raises exception '42000' 11. ... 12. END cs2; 13. INSERT INTO Tab1 VALUES (10); -- Unhandled exception '42000' 14. ... 15. END cs1;
例: 複合文での異なる条件名の使用
次の例は、複合文内でのさまざまな条件名の使用法を示しています。条件名divide_by_zeroとbalance_too_lowは、どちらも同じ複合文内で宣言されています。
CREATE PROCEDURE dec4() cs1: BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012'; DECLARE balance_too_low CONDITION; ... END cs1;
例: SQLSTATE値の例外
次の例は、あるSQLSTATE値に関連する例外を処理するよう定義されているハンドラーが、そのSQLSTATE値に関連付けられた明示的条件も処理できることを示しています。ストアド プロシージャの実行中、CONTINUEハンドラはdivide-by-zero条件とSQLSTATE '22012'となる例外を処理できます。
CREATE PROCEDURE dec5() cs1: BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012'; DECLARE CONTINUE HANDLER FOR SQLSTATE '22012' ... SET IOPar1 = 10/0; ... SIGNAL divide_by_zero; ... END cs1;
例: 複合文内で条件名が2回宣言されている場合の結果
同じ複合文内で同じ条件名を複数回使用することはできません。次の例では、条件名divide_by_zeroは、複合文cs1内で2回宣言されています。ストアド プロシージャのコンパイル中に、エラーSPL1080が報告され、ストアド プロシージャは作成されません。
CREATE PROCEDURE dec6() cs1: BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '22012'; DECLARE divide_by_zero CONDITION FOR SQLSTATE VALUE '42000'; ... END cs1;
例: 同一のSQLSTATE値を異なる条件名に関連付ける場合の結果
同じ複合文内で、同じSQLSTATE値を異なる条件名に関連付けることはできません。次の例では、SQLSTATE値’22012’は、同じ複合文内で条件名divide_by_zeroとzero_divisionの両方に関連付けられています。ストアド プロシージャのコンパイル中に、エラーSPL1081が報告され、ストアド プロシージャは作成されません。
CREATE PROCEDURE dec7() BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012'; DECLARE zero_division CONDITION FOR SQLSTATE '22012'; ... END;
関連トピック
- SQLSTATEコードとその意味については、SQLSTATEのマッピングを参照してください。
- SIGNAL文については、SIGNALを参照してください。条件名は有効な識別子でなければなりません。例: ローカル変数、条件、および別名に対する同じ名前の使用を参照してください。
- 条件名をSQLSTATE値に関連付けます。例: ローカル変数、条件、および別名に対する同じ名前の使用を参照してください。
- 複合文の有効範囲設定ルールにより、それぞれの宣言で別の条件を定義することができます。例: 入れ子の複合文での条件名の使用と例: 複合文内での条件名を参照してください。
- 同じ複合文内で同じ条件名を複数回宣言することができます。例: 複合文内で条件名が2回宣言されている場合の結果を参照してください。
- 条件と変数の宣言は、複合文内で他のタイプの宣言の前に行ないます。例: ローカル変数、条件、および別名に対する同じ名前の使用を参照してください。
- 同じ複合文内で同じSQLSTATE値に関連付けた1つ以上の条件名を宣言することについては、例: 同一のSQLSTATE値を異なる条件名に関連付ける場合の結果を参照してください。
- SQLSTATE値に対して定義されたハンドラーは、そのSQLSTATE値に関連付けられて明示的に宣言された条件も処理します。例: SQLSTATE値の例外を参照してください。