目的
RESIGNALは、ハンドラ宣言からシグナルの再送すなわち条件の再呼び出しを行ないます。RESIGNAL文は、ハンドラー宣言内でのみ明示的に指定できます。
呼び出し
実行可能形式。
ストアド プロシージャのみ。
構文
説明:
- condition_name
- SQLストアド プロシージャ内で条件を識別するため宣言された変数名。
- SQLSTATE [VALUE] SQLSTATE_code
- 条件域のRETURNED_SQLSTATEに割り当てられるSQLSTATEの値。
- value
- 指定した条件情報名に割当てるテキストまたは数値。
- condition_information_item
- 診断域の条件域から得られる、次のテーブルに示されているフィールド名の1つ。
- CLASS_ORIGIN
- RETURNED_SQLSTATEのクラス値を定義した命名権者の識別。
- CONDITION_IDENTIFIER
- SIGNAL文またはRESIGNAL文で指定された条件名。
- CONDITION_NUMBER
- 1から16までの値を取ります。16は、診断域に格納できる条件の最大数です。
- MESSAGE_LENGTH
- MESSAGE_TEXTの長さ(文字数)。
- MESSAGE_TEXT
- この前のSQL文の実行で返されたエラー メッセージまたは警告メッセージのテキスト、またはSIGNAL文またはRESIGNAL文でシグナル情報として指定されたメッセージ。
- RETURNED_SQLSTATE
- この前のSQL文から返されたSQLSTATE値、SIGNAL文またはRESIGNAL文で指定されたSQLSTATE値、または、SIGNAL文またはRESIGNAL文で条件名が指定されている場合の条件名に関連付けられたSQLSTATE値。
- SUBCLASS_ORIGIN
- RETURNED_SQLSTATEのサブクラス値を定義した命名権者の識別。
使用上の注意
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文でユーザー定義条件を使用し、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文の指定条件:
その場合、CLASS_ORIGINの内容は次のようにして決まります。
データ型: 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つ。
データ型: CHARACTER(5) CHARACTER SET LATIN |
SUBCLASS_ORIGIN | RESIGNAL文の指定条件:
その場合、SUBCLASS_ORIGINの内容は次のようにして決まります。
データ型: VARCHAR(128) CHARACTER SET UNICODE
RESIGNAL文でユーザー定義条件を指定すると、SUBCLASS_ORIGINはNULLです。 |
- ステートメント(文)域には、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);
関連トピック
- condition_nameについては、DECLARE CONDITIONを参照してください。
- SQLSTATEコードとその意味については、SQLSTATEのマッピングを参照してください。
- RESIGNAL文で条件名を使用するには、例: SET文の例外を参照してください。
- 複数の条件宣言が同一の条件名に指定されている場合は、例: CONTINUEハンドラーとRESIGNAL文を参照してください。
- シグナル値がRESIGNAL文に指定されている場合は、例: RESIGNAL文でのシグナルの値と情報の使用を参照してください。
- CONDITION_IDENTIFIERについては、例: RESIGNAL文の情報の取得を参照してください。
- シグナル値がSQLSTATE値の場合については、例: 診断域がいっぱいの場合の条件の押し出しを参照してください。
- 外側にある複合文で検索されるハンドラーについては、例: RESIGNAL文の情報の取得および例: 診断域がいっぱいの場合の条件の押し出しを参照してください。
- CONTINUEハンドラーについては、例: CONTINUEハンドラーとRESIGNAL文を参照してください。
- シグナル情報が指定されている場合は、例: ハンドラーから外側への元の例外の伝搬を参照してください。
- SIGNALで指定されたルールについては、SIGNALを参照してください。