17.10 - 使用上の注意 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-171K-JPN
Language
日本語 (日本)

ANSIトランザクションの定義および終了

ANSIセッション モードでは、セッションの最初のSQLリクエストがトランザクションを開始します。そのトランザクションは、COMMIT、ROLLBACK、またはABORT文のどれかを発行すると終了します。リクエストが失敗しても、トランザクションはロールバックされません。ロールバックが発生するのはリクエストの場合のみです。

明示的なABORT

ANSIセッション モードには、暗黙のトランザクションはありません。より正確に言うと、各ANSIトランザクションは暗黙的に開始されますが、常に明示的に完了します。COMMITまたはABORT/ROLLBACKは、必ず明示的に指定しなければならず、トランザクションを正常に終了させるためには、トランザクションの最後の文でなければなりません。

ANSIセッション モードでは、トランザクション内の文がSELECTまたはSELECT AND CONSUMEのみの場合でも、ABORT/ROLLBACK、またはCOMMIT文のどれかを発行する必要があります。

SELECT文の場合、COMMITを発行するのと、ABORT/ROLLBACKを発行するのとでは相違はありません。

SELECT AND CONSUMEの場合、COMMITを発行するのと、ABORT/ROLLBACKを発行するのとでは出力に相違があります。これは、ABORTまたはROLLBACK文は文のサブジェクト キュー テーブルを以前のステータスに回復し、これにはアボートされたSELECT AND CONSUME文で擬似的に消費された行も含まれるからです。

ABORTとROLLBACKは同義語

WORKキーワードがないことを除けば、ABORTはANSI準拠のROLLBACK文のTeradataの同義語です。

ABORTのアクション

ABORTは、次のアクションを実行します。
  1. トランザクションの結果としてデータベースに対して行なわれた変更を元に戻します。
  2. リクエストのためのスプールへの出力を削除します。
  3. トランザクションに関連するロックの設定を解除します。
  4. トランザクションがマクロ リクエストまたは複文リクエストの形式の場合、残りの文は実行されません。
  5. ユーザーに失敗応答を返します。

埋め込みSQLの場合のABORTのアクション

埋め込みSQLアプリケーションの中でABORTを使用すると、以下のような追加の動作が実行されます。
  1. ROLLBACKのアクションを参照してください。
  2. 現在のトランザクション内で準備された動的SQL文を廃棄します。
  3. 開いているカーソルを閉じます。
  4. 処理中のトランザクションによるデータベースの変更内容を取り消します。
  5. ROLLBACKが正常に実行されると、SQLCODEをゼロに設定します。
  6. abort_messageが指定されているかどうかに応じて、SQLCAの最初のSQLERRD要素を3513または3514に設定します。
  7. WHERE句が指定されていれば、SQLCAのSQLERRMフィールドにアボート メッセージを戻します。
  8. RELEASEキーワードが指定されていれば、データベースへのアプリケーション プログラム接続を(明示的または暗黙的に)終了します。
    環境 LOGON/CONNECTリクエストが次のSQLリクエストの前にない場合のプリプロセッサの動作
    メインフレーム接続 暗黙的に接続を確立しようとする
    ワークステーション接続 No Session Establishedエラーを発行する

WHERE句を使用したABORT

ABORTは、それぞれの値を個別にテストします。そのため、集約される値と集約されない値の両方をWHERE句で指定してはなりません。実際には、集約される値がGROUP BYの値になり、グループ化の集約の結果に数学的な計算が実行されます。

例えば、次の条件が当てはまり、次に示すABORT文によってトランザクションが誤って終了すると想定します。
  • testテーブルには、いくつかの行があり、
  • test.colAの合計は188であり、さらに
  • test.colBに値125を備えた新しい行が1行だけある。
     ABORT WHERE (SUM(test.colA) <> 188)
           AND   (test.colb = 125);

先行する文は最初に処理され、1行を選択する条件(colb=125)に従ってすべての行のスキャンが実行された後、条件(SUM(cola) <> 188)に従って、中間的な集約の結果が計算されます。

選択された行のcolAの値は188よりも小さいため、条件はtrueと判断されます。

ABORT WHEREの実行時に、文で実行するオブジェクトに対するREADアクセスが必要な場合には、このDML文を実行するユーザーは、アクセスされるデータに対するSELECT権限を持っていなければなりません。

ABORT文のWHERE句検索条件には、スカラーsubqueryを組み込むことができます。その場合、subqueryにはFROM句が必要です。また、subqueryでの参照の範囲がABORT条件であることが望ましい場合、ABORTにはFROM句がなければなりません。

WHERE句内でUDTを使用したABORT

ABORTは、WHERE句内のUDT式の比較をサポートします。UDT式とは、UDT値を戻すすべての式です。

UDT比較を指定する場合、UDTは定義済みの順序付けを持つ必要があります。<Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184>の「CREATE ORDERING」を参照してください。

ABORT文で相関サブクエリーを使用するためのルール

次のルールは、ABORT文で使用されている相関subqueryに適用されます。
  • ABORTがテーブルを参照する場合には、ABORT文にFROM句が必要です。ABORT文で参照されるすべてのテーブルを、FROM句で定義する必要があります。
  • 内問合わせ列の指定で外のFROM句テーブルを参照する場合、その列参照を完全修飾しなければなりません。
  • Teradataは、ANSI構文への拡張機能としてABORT文をサポートします。同等のANSI SQL文はROLLBACKです。ROLLBACKを参照してください。

相関サブクエリー、スカラー サブクエリー、およびEXISTS述部は、ABORT文のWHERE句内でサポートされます。

相関subqueryを参照してください。

ABORT文でスカラー サブクエリーを使用するためのルール

SELECT文に指定するのと同じ方法で、ABORT文のWHERE句にスカラー サブクエリーを指定することができます。

さらに、スカラーsubqueryを使用したABORT文を、トリガー本体に指定することもできます。ただし、データベースでは、行トリガー内でABORT文のWHERE句に指定した非相関スカラー サブクエリーを、パラメータ化された値としてではなく、単一列の単一行スプールとして処理します。

ABORT文でスカラーUDFを使用するためのルール

UDFが値式を返す場合、UDFのWHERE句でスカラーUDFを呼び出すことができます。ただし、スカラーUDFは、それが式の中で呼び出され、かつ、値式を返す場合に、検索条件としてのみ指定できます。

埋め込みSQLでABORTを使用するためのルール

埋め込みSQLプログラム内でABORTを使用する場合は、以下のルールが当てはまります。

  • ABORTを動的SQLリクエストとして実行することはできません。
  • オプションTRANSACT(2PC)を埋め込みSQLプリプロセッサに対して指定した場合、ABORTは無効です。

複数のABORT文

マクロまたは複文リクエストに複数のABORT文がある場合、これらの文は、どのテーブルにもアクセスしないため、式が構文解析プログラムですぐに評価できた場合でも、指定された順に開始されます。ただし、システムはABORT文を並列処理できます。

システムがABORT文を並列実行し、その文のいずれかが実際にアボートした場合、システムは、マクロまたは複文リクエストで指定された順序に関係なくアボートを報告します。

マクロまたは複文リクエストのEXPLAINレポートを使用して、システムがABORT文を並列実行しているかどうかを確認できます。

2種類のABORT文

ABORT文には、構文解析プログラムによる評価が可能でテーブルへのアクセスを必要としないものと、テーブルへのアクセスを必要とするものという、2つの種類があります。

テーブルを参照しないABORT式を処理し、その実行順序が複文リクエストまたはマクロ内のその他のリクエストと比べて重要でない場合、その式は、テーブルを参照する文よりも前に置くべきです。そうすることにより、早くアボート文を実行できます。

次の例では、最初の2つのABORT文は構文解析プログラムによって評価することができ、テーブルへのアクセスを必要としません。3番目のABORT文は、テーブルへのアクセスが必要です。

     CREATE MACRO macro_name (
       P1 INTEGER,
       P2 INTEGER)
     AS. . .
     ABORT 'error' WHERE :p1 < 0;
     ABORT 'error' WHERE :p2 < 0;
     SELECT. . .
     ABORT 'error' WHERE tab.c1 = :p1;