SQLWARNINGは、すべての完了条件(正常完了と「no data found」条件以外)用のSQLSTATEコードを表わす汎用条件です。
文の実行中に完了条件が発生した場合に、該当する完了条件を処理するハンドラーが存在しないと、SQLWARNINGに関連したハンドラーが呼び出されます。
SQLWARNINGハンドラーは、EXITまたはCONTINUEのどちらかのタイプになります。
SQLWARNINGハンドラーアクション
SQLWARNING汎用条件ハンドラーの制御の流れは、SQLEXCEPTIONハンドラーの制御の流れと似ています。ただし、SQLWARNINGハンドラーは、完了条件の発生によって有効化されることが異なります。
SQLWARNINGでは、「no data found」条件を処理できません。SQLWARNINGハンドラは、NOT FOUNDハンドラーと一緒にかまたは別々にストアド プロシージャ内で宣言されると、「no data found」完了条件によって有効化されなくなります。
例: DECLARE HANDLER(SQLWARNING型)の汎用条件ハンドラー
以下の例は、SQLWARNINGハンドラーの動作を示しています。この例では、以下のストアド プロシージャを想定しています。
CREATE PROCEDURE spSample11() BEGIN DECLARE EmpCount INTEGER; DECLARE EXIT HANDLER FOR SQLWARNING INSERT INTO Proc_Error_Table (:SQLSTATE, CURRENT_TIMESTAMP, 'spSample11', 'Generic handler performed'); -- Statement_11_1 UPDATE Employee SET Salary_Amount = 10000 WHERE Employee_Number = 1001; -- Statement_11_2 SELECT COUNT(*) INTO EmpCount FROM Employee SAMPLE 5; -- Suppose table Employee has only three rows. -- Statement_11_2 returns SQLSTATE 'T7473' that is -- handled by the SQLWARNING handler. END;
例: DECLARE HANDLER(SQLWARNING型)のANSIセッション モード
この例では、以下の3つのSQL文がBTEQからANSIセッション モードで対話式に呼び出されることを想定しています。
INSERT INTO Department VALUES ('10', 'Development'); UPDATE Employee SET Salary_Amount = 10000 WHERE Employee_Number = 1000; CALL spSample11();
上記の3つのSQLステートメントがANSIセッション モードで呼び出されると、次の一連のイベントが起こります。
- 呼び出し元のストアド プロシージャの中のStatement_11_2は、SQLSTATE 'T7473'の完了条件を発生させます。SQLSTATEコード'T7473'用の特定ハンドラーは存在しないため、この条件は、SQLWARNINGハンドラーによって処理されます。
- 条件ハンドラーがEXITタイプであるため、ハンドラ アクションの完了後に制御は呼び出し元に渡されます。
- 以下の項目はアクティブのまま残り、コミットされません。
- 最初の2つの対話式SQL文
- Statement_11_1
- ハンドラー内のINSERT文
- プロセスの終わり。
例: 特定の条件ハンドラーと汎用条件ハンドラ
次の例は、SQLWARNINGハンドラーと特定の条件ハンドラーの両方のDECLARE HANDLERハンドラーが、ストアド プロシージャで組み合わされたときにどのように動作するかを示しています。この例では、以下のストアド プロシージャを想定しています。
CREATE PROCEDURE spSample12() BEGIN DECLARE EmpCount INTEGER DEFAULT 0; -- Handler_1 DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN UPDATE warning_table SET warning_count = warning_count + 1; INSERT INTO Proc_Error_Table (:SQLSTATE, CURRENT_TIMESTAMP, 'spSample12', 'Generic warning handler'); END; -- Handler_2 DECLARE EXIT HANDLER FOR SQLSTATE 'T7473' INSERT INTO Proc_Error_Table (:SQLSTATE, CURRENT_TIMESTAMP, 'spSample12', 'Requested sample is larger than table rows'); -- Statement_12_1 UPDATE Employee SET Salary_Amount = 10000 WHERE Employee_Number = 1001; -- Statement_12_2 SELECT COUNT(*) INTO EmpCount FROM Employee SAMPLE 5; -- Suppose the table Employee has only three rows. -- Statement_12_2 returns SQLSTATE 'T7473' that is -- handled by specific handler. END;
例: spSample12();を呼び出すANSIセッション モード
この例では、以下の3つのSQL文がBTEQからANSIセッション モードで対話式に呼び出されることを想定しています。
INSERT INTO Department VALUES ('10', 'Development'); UPDATE Employee SET Salary_Amount = 10000 WHERE Employee_Number = 1000; CALL spSample12();
上記の3つのSQLステートメントがANSIセッション モードで呼び出されると、次の一連のイベントが起こります。
- Statement_12_2は、SQLSTATEコード'T7473'で完了条件を生じます。この条件は、特定ハンドラーHandler_2によって処理されます。
- Handler_2はハンドラ アクションを実行します。Handler_2はEXITハンドラーで、プロシージャには1つの複合文しか含まれていないので、ハンドラ アクションの完了後にプロシージャは終了します。
- 以下の項目はアクティブのまま残りますが、コミットされません。
- 最初の2つの対話式SQL文
- Statement_12_1
- Handler_2用のアクション文
- プロセスの終わり。