16.20 - DECLARE CONDITION - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQL ストアド プロシージャおよび埋め込みSQL

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1148-162K-JPN

目的

SQLSTATEコードにニーモニック(略号)名を割当てるか、ユーザー定義条件を宣言します。

呼び出し

実行可能な制御宣言。

ストアド プロシージャのみ。

構文



説明

condition_name
SQLSTATEコードに関連付けられたニーモニック(略号)名。SQLSTATE値を指定しないと、条件名を使用してユーザー定義条件を宣言します。
sqlstate_code
処理する5文字リテラルのSQLSTATEコード。
文の正常完了を表わす’00000’を指定することはできません。

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_zerobalance_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_zerozero_divisionの両方に関連付けられています。ストアド プロシージャのコンパイル中に、エラーSPL1081が報告され、ストアド プロシージャは作成されません。

CREATE PROCEDURE dec7()
BEGIN
   DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012';
   DECLARE zero_division CONDITION FOR SQLSTATE '22012';
   ...
END;

関連トピック

以下に関する詳細な情報