ストアド プロシージャ内にある複数の条件ハンドラー - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLストアド プロシージャおよび埋め込みSQL

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/vqj1592443206677.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1148
Product Category
Software
Teradata Vantage

このセクションの例は、以下のストアド プロシージャに基づいています。

CREATE PROCEDURE spSample10()
BEGIN
  DECLARE EmpCount INTEGER;
  DECLARE CONTINUE HANDLER
   FOR SQLSTATE '42000'
   H1:BEGIN
    
   -- Statement_10_1
   UPDATE Employee
   SET Ename = 'John';
    
   -- Suppose column Ename has been dropped.
   -- Statement_10_1 returns SQLSTATE code '52003' that is
   -- defined for the handler within the
   -- block that activates this handler.
    
   -- Statement_10_2
   INSERT INTO Proc_Error_Table (:SQLSTATE,
      CURRENT_TIMESTAMP, 'spSample10', 'Failed to Insert Row');
   END H1;
    
DECLARE EXIT HANDLER
   FOR SQLSTATE '52003'
INSERT INTO Proc_Error_Table (:SQLSTATE,
  CURRENT_TIMESTAMP, 'spSample10', 'Column does not exist');
    
DECLARE CONTINUE HANDLER
   FOR SQLWARNING
INSERT INTO Proc_Error_Table (:SQLSTATE,
  CURRENT_TIMESTAMP, 'spSample10', 'Warning has occurred');
DECLARE CONTINUE HANDLER
   FOR NOT FOUND
INSERT INTO Proc_Error_Table (:SQLSTATE,
 CURRENT_TIMESTAMP, 'spSample10', 'No data found');
-- Statement_10_3
UPDATE Employee
 SET Salary_Amount = 10000
 WHERE Employee_Number = 1001;
   
-- Statement_10_4
INSERT INTO EmpNames VALUES (1002, 'Thomas');
 
-- Suppose table EmpNames has been dropped.
-- Statement_10_4 returns SQLSTATE '42000' that is
-- handled.
-- Statement_10_5
UPDATE Employee
 SET Salary_Amount = 10000
 WHERE Employee_Number = 1003;
  
-- Statement_10_6
SELECT COUNT(*) INTO EmpCount FROM Employee SAMPLE 5;
-- Suppose table Employee has only three rows.
-- Statement_10_6 returns SQLSTATE 'T7473' that is
-- handled by SQLWARNING handler.
-- Statement_10_7
DELETE Employee WHERE Employee_Number = 1;
-- Suppose table Employee does not have a row for
-- Employee_Number = 1. Statement_10_7 returns SQLSTATE
-- '02000' that is handled by NOT FOUND handler.
END;

例: 複数の条件ハンドラー のANSIセッション モード

この例では、以下の3つのSQL文がBTEQからANSIセッション モードで対話式に呼び出されることを想定しています。

INSERT INTO Department VALUES ('10', 'Development');
    
UPDATE Employee
   SET Salary_Amount = 10000
   WHERE Employee_Number = 1000;
   
CALL spSample10();

上記の3つのSQLステートメントがANSIセッション モードで呼び出されると、次の一連のイベントが起こります。

  1. 呼び出されたストアド プロシージャの中のStatement_10_4は、SQLSTATEコード'42000'の例外を発生させます。これは、CONTINUEハンドラーを使って処理されます。
  2. SQLSTATE '42000'に対するハンドラー アクションを実行しているときにStatement_10_1は、SQLSTATEコード'52003'の例外を発生させます。

    ハンドラーによって発生した例外は、ハンドラ アクション句の外では処理できないため、SQLSTATEコード'52003'のハンドラーに制御は渡りません。

  3. プロシージャは終了し、元のSQLSTATEコード'42000'を呼び出し元に戻します。
  4. 以下の文は実行されません。

    Statement_10_2

    Statement_10_5

    Statement_10_6

    Statement_10_7

  5. 以下の文は、まだコミットされていないトランザクション内にアクティブのまま残ります。

    最初の2つの対話式SQL文

    Statement_10_3

  6. プロセスの終わり。