16.20 - SQLSTATE - 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

SQLSTATEは、SQL文のステータス情報を受け取る変数です(埋め込みSQLアプリケーションではホスト変数として明示的に宣言され、ストアド プロシージャではステータス変数として暗黙的に宣言されます)。この情報は、エラー コードや警告コード、および制御文を含めたSQL文の状態です。

ANSI準拠

SQLSTATEは、ANSI/ISO SQL:2011に準拠しています。開発するすべての新規アプリケーションで、SQLCODEの代わりに使用する必要があります。

ストアド プロシージャ プログラムによって使用されるSQLSTATEステータス変数は、ANSI/ISO SQL:2011規格ではありません。

SQLSTATEまたはSQLCODEのいずれかが、ANSIセッション モードで作成されたすべての埋め込みSQLアプリケーションに対して宣言される必要があります。

Teradataセッション モードで実行している埋め込みSQLアプリケーションには、SQLSTATEは有効ではありません。

SQLSTATEがエラー コードを受け取る場所

  • CLI/TDP
  • Teradata Database
  • Preprocessor2実行時管理プログラム

SQLSTATEの構造

SQLSTATEは、5文字の文字列値で、論理的には2文字のクラスと3文字のサブクラスに分けられます。SQLSTATEクラス定義に、ANSI/ISO SQL:2011で定義されているSQLSTATEクラスがリストされています。

サブクラス値は、任意の数値または単一の大文字のローマ字文字列にすることができます。

埋め込みSQLのSQLSTATE型定義

Preprocessor2では、示されているクライアント アプリケーション言語で、次のSQLSTATEデータ型定義が必要です。

クライアント言語 データ型定義
  • COBOL
  • PL/I
CHARACTER(5)
C CHARACTER(6)

6番目の文字は、必ずヌル終了記号になります。

SQLSTATEの宣言

SQLSTATE宣言は、埋め込みSQLとストアド プロシージャ アプリケーションとで次のように異なります。
  • 埋め込みSQLアプリケーションの場合、SQLSTATEはSQL DECLARE SECTION内で明示的に宣言する必要があります。
  • ストアド プロシージャ アプリケーション内では、SQLSTATEは暗黙的に宣言されます。

SQLSTATEおよびSQLCODE両方の使用

同じ埋め込みSQLコンパイル単位内で、SQLSTATEとSQLCODEの両方を定義できます。

また、同じストアド プロシージャ内で、SQLSTATEおよびSQLCODE変数の両方の値をテストできます。

いずれの場合も、両方の構造に有効な結果コードが含まれます。

Teradata Databaseエラー コードをSQLSTATEにマッピングする仕組み

特に指定されていない限り、CLI/TDP、プリプロセッサ ランタイム、およびTeradata Databaseのエラー コードは、実装定義クラスのANSI定義オプションを使用したSQLSTATE値にマッピングされます。
  • マッピングされないCLI/TDPエラーは、クラスT0です。

    そのサブクラスには、3桁のCLIエラー コードが含まれます。

    例えば、CLIエラー157 (無効なUse_Presence_Bitsオプション)は、クラスT0とサブクラス157を生成します。

  • マッピングされないTeradata Databaseエラーは、クラスT1~クラスT9です。

    クラス番号の数字は、Teradata Databaseエラー コードの最初の数字に対応します。

    サブクラスには、残りの3桁のTeradata Databaseエラー コードが含まれます。

    たとえば、エラー3776 (終了しないコメント)は、クラスT3とサブクラス776を生成します。

SQLCODEからSQLSTATEへの例外マッピング

SQLCODE値の中には、CLI、TDP、またはTeradata SQL内に起因しないエラーによって生成されるものがあります。

ストアド プロシージャでのSQLSTATE使用上の制約

ストアド プロシージャ内では、次のようなSQLSTATEの使用が可能です。
  • SET文のオペランドとしての使用。

    例えば、次のような文が可能です。

    SET hErrorMessage = 'SQLSTATE' || sqlstate;
    SET hSQLSTATE = SQLSTATE;
  • ストアド プロシージャ内のSQL文の式としての使用。

    例えば、次のような文が可能です。

    INSERT INTO table_1 (column_1)
    VALUES (:SQLSTATE);
    UPDATE table_1
    SET column_1 = column_1 + :ACTIVITY_COUNT;
ストアド プロシージャ内では、次のようなSQLSTATEの使用は無効です。
  • SQLSTATEは明示的に宣言できない。
  • SQLSTATEは値または式にSETできない。

    例えば、次の文は無効です。

    SET SQLSTATE = h1 + h2;
  • SQLSTATEは、SELECT文のINTO句には指定できない。

    例えば、次の文は無効です。

    SELECT column_1 INTO :SQLSTATE FROM table_1;
  • SQLSTATEは、CALL文のINOUTおよびOUTパラメータの代わりには指定できない。

関連トピック

以下に関する詳細な情報
  • 埋め込みSQLアプリケーションとストアド プロシージャ アプリケーションでのSQLSTATEクラス定義およびマッピングの完全なセットは、SQLSTATEのマッピングに記載されています。
  • Teradata Databaseエラー コードは、<Teradata Vantage™ - データベース メッセージ、B035-1096>を参照してください。
  • コードの例外マッピングについては、SQLコミュニケーション領域(SQLCA)を参照してください。