16.20 - RESIGNAL - 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

目的

RESIGNALは、ハンドラ宣言からシグナルの再送すなわち条件の再呼び出しを行ないます。RESIGNAL文は、ハンドラー宣言内でのみ明示的に指定できます。

呼び出し

実行可能形式。

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

構文



説明:

condition_name
SQLストアド プロシージャ内で条件を識別するため宣言された変数名。
condition_nameが、SQLSTATE値に対応する条件を指定すると、そのSQLSTATEの値は条件域のRETURNED_SQLSTATEに割当てられます。
SQLSTATE [VALUE] SQLSTATE_code
条件域のRETURNED_SQLSTATEに割り当てられるSQLSTATEの値。
value
指定した条件情報名に割当てるテキストまたは数値。
condition_information_item
診断域の条件域から得られる、次のテーブルに示されているフィールド名の1つ。
CLASS_ORIGIN
RETURNED_SQLSTATEのクラス値を定義した命名権者の識別。
値は、クラス値がANSI/ISO SQL:2011規格で定義されている場合はISO 9075、クラス値がSQL:2011規格に対するTeradataのクラス拡張の場合はTeradataとする必要があります。
データ型: VARCHAR(128) CHARACTER SET UNICODE
デフォルト: NULL
CONDITION_IDENTIFIER
SIGNAL文またはRESIGNAL文で指定された条件名。
データ型: VARCHAR(128) CHARACTER SET UNICODE
デフォルト: NULL
CONDITION_NUMBER
1から16までの値を取ります。16は、診断域に格納できる条件の最大数です。
データ型: INTEGER
デフォルト: 0
MESSAGE_LENGTH
MESSAGE_TEXTの長さ(文字数)。
データ型: INTEGER
デフォルト: 0
MESSAGE_TEXT
この前のSQL文の実行で返されたエラー メッセージまたは警告メッセージのテキスト、またはSIGNAL文またはRESIGNAL文でシグナル情報として指定されたメッセージ。
データ型: VARCHAR(128) CHARACTER SET UNICODE
デフォルト: NULL
RETURNED_SQLSTATE
この前のSQL文から返されたSQLSTATE値、SIGNAL文またはRESIGNAL文で指定されたSQLSTATE値、または、SIGNAL文またはRESIGNAL文で条件名が指定されている場合の条件名に関連付けられたSQLSTATE値。
データ型: CHARACTER(5) CHARACTER SET LATIN
デフォルト: NULL
SUBCLASS_ORIGIN
RETURNED_SQLSTATEのサブクラス値を定義した命名権者の識別。
値は、クラス値がANSI/ISO SQL:2011規格で定義されている場合はISO 9075、クラス値がSQL:2011規格に対するTeradataのサブクラス拡張の場合はTeradataとする必要があります。
データ型: VARCHAR(128) CHARACTER SET UNICODE
デフォルト: NULL

使用上の注意

RESIGNALは常に、条件を外側に伝搬させます。ハンドラー アクションからRESIGNAL文が実行されると、RESIGNAL文の外側にある複合文から最も適切な条件ハンドラ宣言を検索します。シグナル値を持つRESIGNAL文は、診断域をクリアしません。

ルール

次のルールが、RESIGNALに適用されます。
  • RESIGNAL文は、条件ハンドラーの外側で使用され、ストアド プロシージャのコンパイル中にリクエストをアボートし、リクエスト側にエラーを返します。
  • RESIGNAL文で条件名が指定されている場合、そのRESIGNAL文を含むハンドラーに適用される有効範囲の中でその条件名を宣言する必要があります。それ以外の場合、ストアド プロシージャのコンパイル中にリクエストをアボートし、リクエスト側にエラーを返します。
  • RESIGNAL文での条件名の使用法は、その条件名がSQLSTATE値に関連付けられている場合には、その条件名が対応するSQLSTATE値の使用法と同じです。
  • 同じ条件名で複数の条件宣言が指定されている場合、RESIGNAL文を含む複合文の有効範囲が最も狭い条件宣言が使用されます。
  • RESIGNAL文でシグナル値が指定され、診断域では、ステートメント(文)域がRESIGNAL文の詳細で変更され、既存の条件域があれば、その条件域はn番目の条件域が(n+1)番目の条件域の位置に置かれるといった形でスタックされます。シグナル情報がRESIGNAL文で指定されている場合、シグナル情報で与えられる詳細情報を使って条件域1を更新してから、既存の条件域をずらします。シグナル値に対応する新しい条件域1が診断域に追加されます。
    • シグナル値が条件名の場合、条件域1にあるCONDITION_IDENTIFIERが条件名を格納するように設定されます。条件名がSQLSTATE値に関連付けられている場合、条件域1のRETURNED_SQLSTATEは、このSQLSTATE値を格納するように設定されます。
    • そうではない場合、シグナル値がSQLSTATE値の場合に、条件域1のRETURNED_SQLSTATEが、このSQLSTATE値を格納するように設定されます。
    • RESIGNAL文で発生した条件を処理するために、RESIGNAL文が含まれた外側にある複合文内でハンドラーが検索されます。
  • RESIGNAL文の外側にある複合文で、RESIGNAL文で発生した条件を処理するハンドラーを持つものがない場合、次のいずれかになります。
    • 例外 ストアド プロシージャは、RESIGNAL文で発生した例外条件で終了します。
    • 完了条件実行は、RESIGNAL文を含むハンドラー内のREGISNAL文の次の文から続行されます。
    • ユーザー定義の例外条件 SQLCODEを7603に、SQLSTATEを'45000'に設定する例外が発生します。
  • RESIGNAL文の外側にある複合文に、RESIGNAL文で発生した条件を処理できるものがない場合、次のいずれかにとなります。
    • CONTINUEハンドラー: ストアド プロシージャの実行は、RESIGNAL文を含むハンドラーを呼び出した文の次の文から続行されます。
    • EXIT ハンドラ: ストアド プロシージャの実行は、アクション句が正常終了したばかりのハンドラーを含むEND文の次の文から続行されます。
  • RESIGNAL文がシグナル値なしで実行されると、次のいずれかになります。
    • 診断域はクリアされ、その元の内容とRESIGNAL文を含むハンドラーが呼び出されて診断域に復元されます。

      条件域1のCONDITION_IDENTIFIERとRETURNED_SQLSTATEには、元の条件と呼び出されたハンドラーが反映されます。

    • シグナル情報が指定されると、条件域1は、RESIGNAL文のシグナル情報指定から取得した詳細を使用して更新されます。
    • ハンドラーが呼び出された元の条件は外側に伝搬され、この条件のハンドラーがRESIGNAL文の外側にある複合文の中にないか検索します。
  • RESIGNAL文でユーザー定義条件を使用し、RESIGNAL文を含む複合文の有効範囲内にその条件を処理するよう定義されたハンドラー宣言がないと、Teradata Databaseはコンパイル中に警告を報告します。

“SIGNAL”で指定されたシグナル情報に関するルールは、RESIGNAL文内のシグナル情報にも適用されます。

診断域の内容

以下の表に、シグナル値とともに指定されたRESIGNAL文の実行後の、ステートメント(文)域の内容を指定します。

フィールド
COMMAND_FUNCTION RESIGNAL
COMMAND_FUNCTION_CODE 91
NUMBER NUMBER < 16の場合、1ずつ増えます。

もし番号 16、値は変更されません。

MORE NUMBER の値が変わっている場合はY。

NUMBER の値が変わっていない場合はN。

ROW_COUNT 0
TRANSACTION_ACTIVE アクティブなトランザクションがない場合は0。

アクティブなトランザクションがある場合は1。

以下のテーブルに、シグナル情報を使って指定したRESIGNAL文実行後の条件域1の内容を指定します。RESIGNAL文でシグナル値も指定されている場合、この条件域は条件番号2にプッシュされます。

フィールド
CLASS_ORIGIN CLASS_ORIGINがシグナル情報に指定されていると、このフィールドには指定された値が入ります。

そうでない場合、既存の値が残ったままになります。

CONDITION_IDENTIFIER このフィールドは変更できないので、既存の値が残ったままになります。
CONDITION_NUMBER このフィールドは変更できないので、既存の値が残ったままになります。
MESSAGE_TEXT RESIGNAL文のシグナル情報に対して指定された値。

そうでない場合、既存の値が残ったままになります。

MESSAGE_LENGTH MESSAGE_TEXTの長さ

RESIGNALにメッセージ テキスト値が指定されていない場合は、このフィールドは0に設定されます。

RETURNED_SQLSTATE このフィールドは変更できないので、既存の値が残ったままになります。
SUBCLASS_ORIGIN シグナル情報内にSUBCLASS_ORIGINが指定されている場合、このフィールドには、指定された値が入っています。

そうでない場合、既存の値が残ったままになります。

以下の表に、シグナル値とともに指定されたRESIGNAL文の実行後の、条件域1の内容を指定します。

フィールド
CLASS_ORIGIN RESIGNAL文の指定条件:
  • RESIGNAL文で指定された条件に関連付けられたSQLSTATE値
  • RESIGNAL文で指定されたSQLSTATE値
その場合、CLASS_ORIGINの内容は次のようにして決まります。
  • クラス値がANSI/ISO SQL規格によって定義されている場合、CLASS_ORIGINはISO 9075になります。
  • クラス値がTeradataによって定義されている場合、CLASS_ORIGINはTeradataになります。

データ型: VARCHAR(128) CHARACTER SET UNICODE。

RESIGNAL文でユーザー定義条件を指定すると、CLASS_ORIGINはNULLです。

CONDITION_IDENTIFIER RESIGNAL文で指定された条件名。

データ型: VARCHAR(128) CHARACTER SET UNICODE。

条件名が指定されていない場合、CONDITION_IDENTIFIERはNULLです。

CONDITION_NUMBER 1

データ型: INTEGER

MESSAGE_TEXT NULL

データ型: VARCHAR(128) CHARACTER SET UNICODE

MESSAGE_LENGTH 0

データ型: INTEGER

RETURNED_SQLSTATE 以下のうちの1つ。
  • RESIGNAL文で指定された条件に関連付けられたSQLSTATE値
  • RESIGNAL文で指定されたSQLSTATE値
  • NULL

データ型: CHARACTER(5) CHARACTER SET LATIN

SUBCLASS_ORIGIN RESIGNAL文の指定条件:
  • RESIGNAL文で指定された条件に関連付けられたSQLSTATE値
  • RESIGNAL文で指定されたSQLSTATE値
その場合、SUBCLASS_ORIGINの内容は次のようにして決まります。
  • クラス値がANSI/ISO SQL規格によって定義されている場合、CLASS_ORIGINはISO 9075になります。
  • クラス値がTeradataによって定義されている場合、CLASS_ORIGINはTeradataになります。
データ型: VARCHAR(128) CHARACTER SET UNICODE

RESIGNAL文でユーザー定義条件を指定すると、SUBCLASS_ORIGINはNULLです。

シグナル値を指定しないRESIGNAL文の実行後、Teradata Databaseは診断域の内容を次のように設定します。
  • ステートメント(文)域には、RESIGNAL文を含んでいるハンドラーが呼び出された診断域のステートメント(文)域の内容が設定されます。
  • 条件域は、RESIGNAL文を含んでいるハンドラーが呼び出された診断域の条件域に設定されます。

例: SET文の例外

この例の実行時に、プロシージャ定義内の最後のSET文でSQLCODE 2802とSQLSTATE '22012'を返す例外が発生します。

SQLSTATE '22012'の処理のため、CONTINUEハンドラーが呼び出され、RESIGNAL文が実行されます。

条件out_of_rangeはSQLSTATE '22003'に関連付けられており、SQLSTATE '22003'は複合文cs1に伝搬され、EXITハンドラーが呼び出されます。

ハンドラー アクション文が正常に実行された後、制御はcs1にあり、ストアド プロシージャは正常に終了します。

CREATE PROCEDURE resignalsp3 (INOUT IOParam INTEGER,
                              OUT   OParam INTEGER)
cs1: BEGIN
    DECLARE out_of_range CONDITION FOR SQLSTATE '22003';
    DECLARE EXIT HANDLER FOR SQLSTATE '22003'
        SET OParam = 0;
    cs2: BEGIN
        DECLARE CONTINUE HANDLER FOR SQLSTATE  '22012'
             RESIGNAL out_of_range;
        SET IOParam = 0;
        SET OParam = 20 / IOParam;
    END cs2;
END cs1;
BTEQ> CALL resignalsp3 (0, OParam);

例: CONTINUEハンドラーとRESIGNAL文

次の例は、外側の複合文内のCONTINUEハンドラーが内側の複合文のRESIGNAL文で発生した条件を処理するときの戻り点を示しています。

実行時、SET文で例外SQLSTATE '22012'が発生します。

CONTINUEハンドラーが呼び出され、ハンドラー アクション文の一部としてRESIGNAL文が実行されます。

条件宣言はRESIGNAL文が含まれている複合文の有効範囲の方が狭いので、RESIGNAL文は、cs2で宣言されている条件を参照します。

Condition1は、SQLSTATE '21000'に関連付けられているため、例外条件はそれを含む外側の複合文cs1に伝搬され、SQLSTATE '21000'のCONTINUEハンドラーが呼び出されます。

ハンドラー アクション文が正常に実行された後、制御はプロシージャ定義内の最後のSET文の次の文に戻ります。

CREATE PROCEDURE resignalsp5(INOUT IOParam INTEGER,
                             OUT   OParam INTEGER)
cs1:BEGIN
    DECLARE Condition1 CONDITION FOR SQLSTATE '22012';
    DECLARE EXIT HANDLER FOR Condition1
            SET OParam = 0;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '21000'
            SET OParam = 100;
    cs2:BEGIN
        DECLARE Condition1 CONDITION FOR SQLSTATE '21000';
        DECLARE CONTINUE HANDLER FOR SQLSTATE '22012'
        BEGIN
           RESIGNAL Condition1;
           …
        END;
        SET IOParam = 0;
        SET OParam = 20 / IOParam;
        …
    END cs2;
END cs1;
BTEQ> CALL resignalsp5 (0, OParam);

例: RESIGNAL文でのシグナルの値と情報の使用

次の例は、RESIGNAL文でのシグナル値とシグナル情報の使用法を示しています。

ストアド プロシージャの実行中、RESIGNAL文は条件域1内のMESSAGE_TEXTを'Sampling error'で更新し、MESSAGE_LENGTHが暗黙的に14に設定されます。

シグナル値はRESIGNAL文で指定されているため、診断域の既存の条件域がプッシュ ダウンされ、診断域にはRETURNED_SQLSTATEを'T7473'、CONDITION_NUMBERを1とする新しい条件域が追加されます。

CREATE PROCEDURE setsignalsp3(OUT OPar CHAR(100))
cs1: BEGIN
    …
    cs2: BEGIN
      DECLARE samp_error CONDITION;
      DECLARE CONTINUE HANDLER FOR samp_error
       RESIGNAL SQLSTATE 'T7473'
        SET MESSAGE_TEXT = 'Sampling error';
       …
      SIGNAL samp_error;
    …
    END cs2;
END cs1;
BTEQ> .COMPILE FILE setsignalsp3.spl
BTEQ> CALL setsignalsp3(OPar);

例: ハンドラーから外側への元の例外の伝搬

次の例は、元の例外をハンドラーから外側に伝搬する方法を示しています。

ストアド プロシージャの実行中に、プロシージャ定義内の最後のINSERT文で重複行例外が発生し、SQLSTATE ’23505’に対して宣言されたハンドラーが呼び出されます。

SQLSTATE、CURRENT_TIMESTAMP、'spSample1'、および'Failed to Insert record'を挿入するハンドラ アクション文は、SQLSTATE '42000'で別の例外となり、汎用のSQLEXCEPTIONハンドラーが始動します。

ハンドラは、そのハンドラーが処理するはずだった元の例外でRESIGNAL文を発行します。

診断域がクリアされ、ハンドラーが呼び出されたときの元の状態に復元されます。これで、条件域1には、元の例外SQLSTATE '42000'が復元されることになります。

RESIGNAL文にはシグナル情報が指定されているので、条件域1のMESSAGE_TEXTが'Table does not exist'に更新されます。

MESSAGE_LENGTHは20に暗黙的に設定されます。次に、プロシージャ定義内の最初の条件ハンドラーが呼び出されて、例外SQLSTATE '42000'を処理します。

ハンドラー アクション文が正常完了した後、制御はNSERTハンドラ アクション文の次の文に戻ります。

CREATE PROCEDURE spSample3(IN pName     CHAR(30),
                           IN pAmt      INTEGER,
                              Osqlstate CHAR(5),
                              Omsg      CHAR(30))
BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'
     GET DIAGNOSTICS EXCEPTION 1
          Osqlstate = RETURNED_SQLSTATE, Omsg = MESSAGE_TEXT;
  L1:BEGIN
     DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
     BEGIN
          DECLARE EXIT HANDLER FOR SQLEXCEPTION
          BEGIN
           DELETE FROM tab1;
           RESIGNAL SET MESSAGE_TEXT = 'Table does not exist';
          END;
          INSERT INTO Proc_Error_Tbl
          VALUES (SQLSTATE, CURRENT_TIMESTAMP, 'spSample1',
                  'Failed to Insert record');
          …
     END;
     INSERT INTO tab1 VALUES (pName, pAmt);
     INSERT INTO tab1 VALUES (pName, pAmt); -- Duplicate row error
     …
  END L1;
  …
END;
BTEQ> .COMPILE FILE nblk3.spl
BTEQ> CREATE SET TABLE tab1(c1 CHAR(30), c2 INTEGER);
BTEQ> DROP TABLE Proc_Error_Tbl;
BTEQ> CALL spSample3('Richard', 100, OSqlstate, OMsg);

例: 呼び出し元のストアド プロシージャが呼び出し先のストアド プロシージャから返された条件を処理する方法

次の例は、呼び出し元のストアド プロシージャが、例外条件で終了した呼び出し先のストアド プロシージャから返された条件を処理する方法を示します。

外側のストアド プロシージャresignalsp1の実行中に、CALL文が内側のストアド プロシージャresignalsp2を呼び出します。

resignalsp2では、SIGNAL文で完了条件SQLSTATE '02000'が発生します。

SIGNAL文はまず、診断域をクリアします。次に、ステートメント(文)式が更新され、RETURNED_SQLSTATE '02000'で条件域1が追加されます。この条件に対して、CONTINUE HANDLERが呼び出されます。

RESIGNAL文でユーザー定義条件nodataが発生します。

ステートメント(文)域が、RESIGNAL文の詳細を使って更新されます。

条件域1は、診断域で条件域2としてプッシュ ダウンされ、nodataに対応して新しい条件域1が追加されます。

このユーザー定義条件に対するハンドラーはなく、また、resignalsp2は例外条件ERRRTSNOCOND (SQLCODE 7603およびSQLSTATE '45000')で終了します。

resignalsp1では、CALL文がcs2でSQLSTATE ’45000’を処理するように宣言された条件ハンドラーによって処理される例外ERRRTSNOCONDを報告します。

GET DIAGNOSTICS文が診断域から条件域1を取得し、'nodata'をcondnameに割当てます。

RESIGNAL文でユーザー定義条件nodataを発生し、この条件は内側のプロシージャでnodataに対して定義されたハンドラーによって処理されます。

CALL文は、OParam1 = 0、pcondno = 1、およびcount = 0を返します。

外側のストアド プロシージャは次のように定義されています。

CREATE PROCEDURE resignalsp1 (OUT   OParam1 INTEGER,
                              INOUT pcondno INTEGER,
                              OUT   count   INTEGER)
cs1 :BEGIN
     DECLARE nodata CONDITION;
     DECLARE cnt INTEGER DEFAULT VALUE 0;
     DECLARE CONTINUE HANDLER FOR nodata
         SET count = 0;
     cs2:BEGIN
         DECLARE CONTINUE HANDLER FOR SQLSTATE '45000'
         BEGIN
           GET DIAGNOSTICS EXCEPTION pcondno
               condname = CONDITION_IDENTIFIER;
           IF (condname = 'nodata') THEN
               RESIGNAL 'nodata';
           END IF;
         END;
          SET OParam1 = 0;
          CALL resignalsp2(cnt); /* returns exception '45000' */
     END cs2;
END cs1;

内側のストアド プロシージャは次のように定義されています。

CREATE PROCEDURE resignalsp2 (OUT OParam1 INTEGER)
cs1 :BEGIN
     DECLARE cnt INTEGER DEFAULT VALUE 0;
     cs2:BEGIN
         DECLARE nodata CONDITION;
         DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
                RESIGNAL nodata;
         SET OParam1 = 0;
         SELECT COUNT(*) INTO cnt FROM tab1;
          IF (cnt = 0) THEN
            SIGNAL SQLSTATE '02000';
            …
          ELSE
             SET OParam1 = cnt;
          END IF;
     END cs2;
END cs1;
BTEQ> CREATE SET TABLE  tab1 (c1 INTEGER);
BTEQ> CALL resignalsp1(OParam1, 1, condname);

例: RESIGNAL文の情報の取得

次の例は、ユーザー定義条件がRESIGNAL文で指定されているときに、条件域2に対応する情報の取得方法を示しています。

ストアド プロシージャの実行中に、SELECT…INTO文で完了条件SQLSTATE '02000'が発生します。

ステートメント(文)域には、SELECT…INTO文の詳細が入り、診断域には条件域が追加されて完了条件に関する情報が入ります。

SQLSTATE ’02000’のハンドラーが呼び出され、完了条件SQLSTATE '02000'を処理します。

ハンドラー アクション内のRESIGNAL文でユーザー定義条件nodataが発生します。

条件域1は、診断域内でプッシュ ダウンされて条件域2となり、ユーザー定義条件nodataに対応して新しい条件域1が追加されます。

ユーザー定義条件nodataは、外側の複合文に伝搬されます。

複合文cs1内のnodataハンドラーがユーザー定義条件nodataを処理します。

GET DIAGNOSTICS文が条件域1を取得し、CONDITION_IDENTIFIERから得た'nodata'をcondidに割当てます。

第2のGET DIAGNOSTICS文は条件域2を取得し、RETURNED_SQLSTATEから得たSQLSTATE '02000'をsqlstate1に割当てます。

END cs2より前の処理が終了したら、ストアド プロシージャの実行が再開されます。CALL文は、OParam1 = 0、pcondno = 2、およびsqlstate1 = '02000'を返します。

CREATE PROCEDURE resig6 (OUT   OParam1 INTEGER,
                         INOUT pcondno INTEGER,
                         OUT   sqlstate1 CHAR(5),
                         OUT   condid CHAR(10))
cs1 :BEGIN
     DECLARE nodata CONDITION;
     DECLARE CONTINUE HANDLER FOR nodata
     BEGIN
         GET DIAGNOSTICS EXCEPTION 1
             condid = CONDITION_IDENTIFIER;
         GET DIAGNOSTICS EXCEPTION pcondno
             sqlstate1 = RETURNED_SQLSTATE;
     END;
      cs2: BEGIN
           DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
           BEGIN
               RESIGNAL nodata;
               …
           END;
          SET OParam1 = 0;
          SELECT c1
          INTO OParam1 FROM tab1; -- Returns warning  NO DATA FOUND
          …
      END cs2;
END cs1;
BTEQ> CREATE SET TABLE  tab1 (c1 INTEGER);
BTEQ> CALL resig6(OParam1,2,sqlstate1, condid);

例: 診断域がいっぱいの場合の条件の押し出し

次の例は、診断域がいっぱいになった場合に、条件域16がプッシュアウトされて次の条件を受け入れることを示しています。RESIGNAL文でSQLSTATEが指定されます。

ストアド プロシージャの実行中に、cs16内のSELECT…INTO文で完了条件SQLSTATE '02000'が発生します。

ステートメント(文)域に、SELECT…INTO文の詳細が入り、条件域1が診断域に追加されます。

完了条件SQLSTATE '02000'に対してcs16内のハンドラーが呼び出されます。cs16内のRESIGNAL文で条件'23505'が発生します。

診断域で既存の条件域がプッシュ ダウンされ、条件番号が1大きくなります。

ステートメント(文)域が更新され、条件番号1の新しい条件域が診断域に追加されます。

条件は、cs15で定義されたハンドラーによって処理されます。cs15内のRESIGNAL文では条件SQLSTATE '23505'が発生します。

診断域では、既存の条件域がプッシュ ダウンされます。条件域2は条件域3になり、SQLSTATE '23505'に対し新しい条件域1が追加されます。条件域をずらして新しい条件域を追加する動作は、すべてのRESIGNAL文について発生します。

最後に、cs2内のRESIGNAL文で条件SQLSTATE '23505'が発生し、診断域の最上部に新しい条件域1が追加され、その他の条件域はすべて1つプッシュ ダウンされます。

条件は、cs1内のハンドラーによって処理され、cs1内のRESIGNAL文では条件SQLSTATE '23505'が発生します。

ここで、診断域内の条件の合計数は、格納できる条件域の最大数の限度である16に到達しました。

条件域16は診断域から出され、他の全ての条件域が1つプッシュ ダウンされ、新しい条件が条件域1として追加されます。

ステートメント(文)域のNUMBERは16のままで、MOREがYに設定されます。発生した条件はcs0のCONTINUEハンドラーによって処理されます。

cs0内のGET DIAGNOSTICS文が条件域16からRETURNED_SQLSTATE '23505'を取得し、それをsqlstate1に割当てます。ハンドラー タイプがCONTINUEなので、ストアド プロシージャはcs16内のSET文から処理を続行します。

CALL文は、OParam1 = 0およびsqlstate1 = '23505'を返します。

CREATE PROCEDURE resig6 (OUT OParam1 INTEGER,
                         OUT sqlstate1 CHAR(5))
cs0: BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
 GET DIAGNOSTICS EXCEPTION 16
     sqlstate1 = RETURNED_SQLSTATE;
 cs1: BEGIN
 DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
    RESIGNAL SQLSTATE '23505';
  cs2: BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
     RESIGNAL SQLSTATE '23505';
   cs3: BEGIN
   DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
      RESIGNAL SQLSTATE '23505';
    cs4: BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
       RESIGNAL SQLSTATE '23505';
     cs5: BEGIN
     DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
        RESIGNAL SQLSTATE '23505';
      cs6: BEGIN
      DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
         RESIGNAL SQLSTATE '23505';
       cs7: BEGIN
       DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
          RESIGNAL SQLSTATE '23505';
        cs8: BEGIN
        DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
           RESIGNAL SQLSTATE '23505';
         cs9: BEGIN
         DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
            RESIGNAL SQLSTATE '23505';
          cs10: BEGIN
          DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
             RESIGNAL SQLSTATE '23505';
           cs11: BEGIN
           DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
              RESIGNAL SQLSTATE '23505';
            cs12: BEGIN
            DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
               RESIGNAL SQLSTATE '23505';
             cs13: BEGIN
             DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
                RESIGNAL SQLSTATE '23505';
              cs14: BEGIN
              DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
                 RESIGNAL SQLSTATE '23505';
               cs15: BEGIN
               DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'
                  RESIGNAL SQLSTATE '23505';
                cs16:BEGIN
                DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
                   RESIGNAL SQLSTATE '23505';
                SELECT c1 INTO OParam1 from tab1;
                -- Returns warning  NO DATA FOUND
                SET OParam1 = 0;
                END cs16;
               END cs15;
              END cs14;
             END cs13;
            END cs12;
           END cs11;
          END cs10;
         END cs9;
        END cs8;
       END cs7;
      END cs6;
     END cs5;
    END cs4;
   END cs3;
  END cs2;
 END cs1;
END cs0;
BTEQ> CREATE SET TABLE  tab1 (c1 INTEGER);
BTEQ> CALL resig6(OParam1, sqlstate1);

関連トピック

以下に関する詳細な情報