NOT FOUNDは、すべての「no data found」完了条件用のSQLSTATEコードを表わす一般条件です。
文の実行中に「no data found」完了条件が発生した場合に、特定の条件を処理するハンドラーが存在しないと、NOT FOUNDに関連付けられたハンドラーが呼び出されます。
NOT FOUNDハンドラーは、EXITまたはCONTINUEのどちらかのタイプになります。
NOT FOUNDハンドラー アクション
NOT FOUND汎用条件ハンドラーの制御の流れは、SQLEXCEPTIONまたはSQLWARNINGハンドラーの制御の流れと似ています。相違点は、NOT FOUNDハンドラは「no data found」完了条件が発生すると有効化されることです。
例: NOT FOUNDハンドラーの動作
以下の例は、NOT FOUNDハンドラーの動作を示しています。この例では、以下のストアド プロシージャを想定しています。
CREATE PROCEDURE spSample11() BEGIN DECLARE EmpCount INTEGER; DECLARE EXIT HANDLER FOR NOT FOUND INSERT INTO Proc_Error_Table (:SQLSTATE, CURRENT_TIMESTAMP, 'spSample11', 'Generic no data found handler performed'); -- Statement_11_1 UPDATE Employee SET Salary_Amount = 10000 WHERE Employee_Number = 1001; -- Statement_11_2 DELETE Employee WHERE Employee_Number = 1; -- Suppose table Employee does not have a row for -- Employee_Number 1. Statement_11_2 returns SQLSTATE -- '02000' that is handled by NOT FOUND handler. END;
例: DECLARE HANDLER(NOT FOUND型)の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 '02000'の完了条件を発生させます。SQLSTATEコード'02000'用の特定ハンドラーは存在しないため、この条件は、NOT FOUNDハンドラーによって処理されます。
- 条件ハンドラーがEXITハンドラーであるため、ハンドラー アクションの完了後に制御は呼び出し元に渡されます。
- 以下の項目はアクティブのまま残り、コミットされません。
- 最初の2つの対話式SQL文
- Statement_11_1
- ハンドラー内のINSERT文
- プロセスの終わり。
例: DECLARE HANDLERの両方のフォームを組み合わせたときの特定の条件ハンドラーと汎用の条件ハンドラ
次の例は、NOT FOUNDハンドラーと特定の条件ハンドラーの両方のDECLARE HANDLERハンドラーが、ストアド プロシージャで組み合わされたときにどのように動作するかを示しています。この例では、以下のストアド プロシージャを想定しています。
CREATE PROCEDURE spSample12() BEGIN DECLARE CONTINUE HANDLER FOR NOT FOUND -- Handler_1 BEGIN UPDATE warning_table SET warning_count = warning_count + 1; INSERT INTO Proc_Error_Table (:SQLSTATE, CURRENT_TIMESTAMP, 'spSample12', 'Generic no data found handler'); END; DECLARE EXIT HANDLER FOR SQLSTATE '02000' -- Handler_2 INSERT INTO Proc_Error_Table (:SQLSTATE, CURRENT_TIMESTAMP, 'spSample12', 'No data found'); -- Statement_12_1 UPDATE Employee SET Salary_Amount = 10000 WHERE Employee_Number = 1001; -- Statement_12_2 DELETE Employee WHERE Employee_Number = 1; -- Suppose table Employee does not have a row for -- Employee_Number 1. Statement_12_2 returns SQLSTATE -- '02000' that is handled by NOT FOUND handler. END;
例: Handler_2がハンドラー アクションを実行したときの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セッション モードで呼び出されると、次の一連のイベントが起こります。
- Handler_2はハンドラ アクションを実行します。Handler_2はEXITハンドラーであるため、ハンドラー アクションの完了後に制御は呼び出し元に渡されます。
- Statement_12_2は、SQLSTATEコード'02000'で完了条件を生じます。この条件は、特定ハンドラーHandler_2によって処理されます。
- 以下の項目はアクティブのまま残りますが、コミットされません。
- 最初の2つの対話式SQL文
- Statement_12_1
- Handler_2用のアクション文
- プロセスの終わり。