外部ストアド プロシージャがCLIv2またはJDBCを使用して、トリガー内からの実行が許可されないSQL文(トリガーされるアクション文を参照)を実行すると、Teradata Databaseは次のいずれかを返します。
- CLIv2ベースの外部ストアド プロシージャへの障害メッセージ。
- JDBCベースの外部ストアド プロシージャへの例外。
システムは外部プロシージャにメッセージを返し、エラーを出す機会を提供し、さらに外部ファイルまたは確立済みの接続をきれいに閉じるまたは切断します。残りの一連のアクションは、プロシージャが呼び出し側に何かを返すためのものです。
外部ストアド プロシージャが返す内容に応じて、次の結果が発生します。
外部プロシージャ | 結果 |
---|---|
プロシージャ自身のエラーとともに返される | SQLSTATEをプロシージャ自身の例外コードに設定し、もとの失敗の状態はプロシージャの呼び出し側にはわかりません。 |
エラーは返さない(SQLSTATE値は「00000」) | システムは、もとの実行失敗情報を呼び出し側に返します。 |
別のリクエストを実行しようとする | システムは、トリガー失敗メッセージを受け取った後にプロシージャがリクエストを実行したため、エラーを返します。 |
システムは、これらすべての場合でリクエストのトリガーを中止します。
以下の表では、次のシナリオで考えられる3つの結果の例を示します。
トリガーが次のように定義されていると想定します。
CREATE TRIGGER trig2 AFTER INSERT ON t2 FOR EACH ROW (CALL sqlxspex(2););
次に、CLIv2またはJDBC関数呼出しのいずれかを使用して、外部ストアド プロシージャから次の2つのリクエストを実行します。ここで、ThisIsNotATableという名前のテーブルは存在しません。
INSERT INTO t2 VALUES (1,1); DELETE FROM ThisIsNotATable ALL;
現行データベースにThisIsNotATableという名前のテーブルがないため、システムはプロシージャにエラーを返します。
プロシージャ | その結果 |
---|---|
プロシージャ自身のエラーを返す | エラー メッセージでSQLSTATEコードを報告し、テキスト メッセージはプロシージャ内でコーディングされます。次に例を示します。*** Failure 7504 in UDF/XSP/UDM rgs.sqlxspex: SQLSTATE U0001: Statement# 1, Info =0 *** Total elapsed time was 1 second. この例の結果は、システムによって決定されるわけではありませんが、プロシージャがどのようにコーディングされるのかに完全に依存します。 例は、外部プロシージャがシステムによりトリガーに返されるエラーをどのように処理するのかを示すように考えられています。このケースでは、プロシージャは7504エラー時にSQLSTATEを'U0001'を設定するようにコーディングされていますが、有効なSQLSTATEコードおよびユーザー作成テキスト メッセージの両方が使用されています。 |
SQLSTATE「00000」を返す | エラー メッセージは、外部ストアド プロシージャに報告された最初のエラーを報告します。*** Failure 3807 SQLXSPEX:Object 'ThisIsNotATable' does not exist. Statement# 1, Info =0 *** Total elapsed time was 1 second. この場合、元のエラーは、プロシージャが存在しないテーブルに対して実行しようとしたDELETEリクエストの実行失敗情報です。 |
エラーを無視し、別のSQLリクエストを実行しようとする | プロシージャは、次のエラー メッセージで終了します。*** Failure 7836 The XSP mydbase.sqlxspex submitted a request subsequent to receiving a trigger fail message. Statement# 1, Info =0 *** Total elapsed time was 1 second. |