16.20 - DECLARE HANDLER (NOT FOUNDタイプ) - 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

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セッション モードで呼び出されると、次の一連のイベントが起こります。

  1. 呼び出し元のストアド プロシージャの中のStatement_11_2は、SQLSTATE '02000'の完了条件を発生させます。SQLSTATEコード'02000'用の特定ハンドラーは存在しないため、この条件は、NOT FOUNDハンドラーによって処理されます。
  2. 条件ハンドラーがEXITハンドラーであるため、ハンドラー アクションの完了後に制御は呼び出し元に渡されます。
  3. 以下の項目はアクティブのまま残り、コミットされません。
    • 最初の2つの対話式SQL文
    • Statement_11_1
    • ハンドラー内のINSERT文
  4. プロセスの終わり。

例: 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セッション モードで呼び出されると、次の一連のイベントが起こります。

  1. Handler_2はハンドラ アクションを実行します。Handler_2はEXITハンドラーであるため、ハンドラー アクションの完了後に制御は呼び出し元に渡されます。
  2. Statement_12_2は、SQLSTATEコード'02000'で完了条件を生じます。この条件は、特定ハンドラーHandler_2によって処理されます。
  3. 以下の項目はアクティブのまま残りますが、コミットされません。
    • 最初の2つの対話式SQL文
    • Statement_12_1
    • Handler_2用のアクション文
  4. プロセスの終わり。