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

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

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

例: 特定の条件ハンドラーと汎用条件ハンドラ

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

  1. Statement_12_2は、SQLSTATEコード'T7473'で完了条件を生じます。この条件は、特定ハンドラーHandler_2によって処理されます。
  2. Handler_2はハンドラ アクションを実行します。Handler_2はEXITハンドラーで、プロシージャには1つの複合文しか含まれていないので、ハンドラ アクションの完了後にプロシージャは終了します。
  3. 以下の項目はアクティブのまま残りますが、コミットされません。
    • 最初の2つの対話式SQL文
    • Statement_12_1
    • Handler_2用のアクション文
  4. プロセスの終わり。