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

目的

動的SQL文を実行用に準備し、これに名前を割り当てます。

呼び出し

実行可能形式。

動的SQL。

埋め込みSQLのみ。

構文



statement_name
準備する文に関連付ける名前。
statement_name は有効なSQL識別子でなくてはならず、単一引用符で囲んではなりません。
descriptor_area
準備された文が実行されたときに、返されたデータに関する記述情報を受け取るためのSQLDAを指定します。
SQLDA構造がポインタとして宣言されている場合、descriptor_areaを名前またはポインタ参照(*sqldaname)としてCプログラムに指定できます。
statement_string
文字列表現による、SQL文のテキスト。
statement_string_variable
ホスト変数の形の動的SQL文のテキスト。
statement_string_variableの前にコロンを付けるかどうかは任意指定です。
statement_number
記述情報を要求する対象となるリクエストの中での文の番号を識別する有効な整数リテラル。
numeric_variable
記述情報を要求する対象となるリクエストの中での文番号を表わす、INTEGERまたはSMALLINT型のホスト変数。
先行コロンを使用するかどうかは任意指定です。

ANSI準拠

PREPAREは、ANSI/ISO SQL:2011に準拠しています。

許可

なし。

SQL文の準備

ここで定義した構文要素を使うと、プロセスは以下のようになります。
  1. 変数statement_stringを、クライアント アプリケーションの言語で宣言します。
  2. statement_stringを、実行するSQL文のリテラル文字テキストとして定義します(クライアント アプリケーションの言語で)。
  3. ホスト定数statement_stringをSQL変数statement_nameとして定義し、SQL内からPREPARE文を実行します。

    PREPAREによって、ソース コードをstatement_nameから実行可能オブジェクト コードにコンパイルします。

  4. statement_nameに対してEXECUTEまたはEXECUTE IMMEDIATEを実行します。
  5. データベース ソフトウェアが、戻りコードをSQLCODEおよびSQLSTATEに通知します。

ルール

動的SQLを使用するときには、必ずSQLDAを定義しなければなりません。

statement_nameは、18文字を超えてはなりません。

列式として指定するか、またはホスト変数として指定するかにかかわらず、動的SQL文は最大で32キロバイトまでの長さにすることができます (SQLテキスト、USINGデータ、およびパーセル オーバーヘッドを含めて)。

ホスト変数として指定する場合、そのステートメント文字列は、クライアント プログラミング言語用のSQL文字列のルールに従う必要があります。

言語 statement_stringの形式
COBOL 非数値リテラル
C
PL/I 文字列式
statement_string内の動的SQL文のテキストは、以下のようになります。
  • 単文リクエストまたは複文リクエストのいずれも可能
  • EXEC文を組み込むことができる
  • データを戻す文を組み込むことができる

文字列変数がVARCHARである場合、文のテキストは最大64Kにできる

動的SQL文に不可であることの説明:
  • 以下のいずれのSQL文も指定することはできません。
    ABORT EXECUTE IMMEDIATE
    BEGIN TRANSACTION FETCH
    CHECKPOINT LOGOFF
    CLOSE LOGON
    COMMIT OPEN
    CONNECT POSITION
    DESCRIBE PREPARE
    ECHO REWIND
    END TRANSACTION ROLLBACK
    EXECUTE  
  • Preprocessor2宣言にはできません。

動的SQL文にはパラメータ マーカーまたはプレースホルダー トークン(疑問符)を使用することができ、ここでは任意の定数(特にホスト変数)参照が有効です。

OPEN文およびEXECUTE文のUSING句によって、値がその文に提供されます。

プレースホルダーには、型付き、および型なしがあります。
  • 型付きプレースホルダーの場合、データ型が明示的にキャストされます。例えば、以下のUPDATE文では、part_noが型付きプレースホルダーです。
    UPDATE parts
    SET part_no = (CAST(? AS INTEGER))
    WHERE vendor_no = ?;

    このアクションによって、変数のデータ型は、実行時にプレースホルダーにキャストされるタイプか、またはそのタイプに変換できるタイプに設定されます。

  • 型なしプレースホルダーのデータ型は、文脈によって決定されます。

    例えば、以下の文では、WHERE句内の型なしプレースホルダーのタイプはvendor_noのタイプと同じです。

    UPDATE parts
    SET part_no = (CAST(? AS INTEGER)
    WHERE vendor_no = ?;

CASE式でTHEN/ELSE句の結果としてプレースホルダーを使用できるのは、CASE式内の少なくとも他の1つの結果がプレースホルダーでもNULLキーワードでもない場合に限ります。

以下のようなタイプなしプレースホルダーの使用方法は無効です。
  • 単項演算子のオペランドとしての使用

    例えば、+ ?は無効です。

  • 2項演算子の両方のオペランドとしての使用

    例えば、? + ?は無効です。

  • 比較演算子の両方のオペランドとしての使用

    例えば、以下のSELECT文は無効です。

    SELECT *
    FROM table_name
    WHERE ? = ?

    いずれかのプレースホルダーを0+で置き換えると、そのような値のもとではデータ型が数値であることが文脈によって明確に判別できるので、比較は有効になります。

    同様に、比較において、対応する2つのフィールドを表わすようにプレースホルダーを使用することはできません。

    例えば、以下のような場合、それぞれの対の最初の値のタイプがPREPARE時点で文脈から判別できず、不明であるため、この比較は無効です。

    (?,X) > (?,Y)

    ただし、以下の比較は有効です。これは、PREPARE時に文脈からタイプを判別できるためです。

    (?,X) > (Y,?)
  • POSITION関数の両方のオペランドとしての使用
  • UPPER関数の唯一のオペランドとしての使用
  • LOWER関数の唯一のオペランドとしての使用
  • TRIM関数の2番目、または3番目のオペランドとしての使用
  • EXTRACT関数のFROMオペランドとしての使用
  • TRANSLATE関数の最初のオペランドとしての使用
  • いずれかの集約関数の引数としての使用
  • IS [NOT] NULLの左側のオペランドのいずれかの構成要素としての使用
  • OVERLAPS比較のどちらかのオペランドの2番目の構成要素としての使用
  • 単独の項目選択式としての使用

    例えば、以下のSELECTは無効です。

    SELECT ? AS alias_name
    FROM table_name;

    ただし、以下のSELECT文は有効です。これは、SELECTリスト内の式全体としてではなく、式の一部としてプレースホルダーが使用されているためです。

    SELECT 0 + ? AS alias_name
    FROM table_name;
INTO句 (およびオプションのUSING句)を含むPREPARE文を実行するということは、以下の操作と厳密に同等です。
  • INTO句およびUSING句を使わずにPREPARE文を実行すること
  • INTO句およびUSING句を使って準備済みの文に対してDESCRIBE文を実行すること
  • PREPAREを動的SQL文として実行することはできません。

関連トピック

詳細は、以下の文を参照してください。
  • DESCRIBE
  • EXECUTE (動的SQL形式)
  • EXECUTE IMMEDIATE
  • SQL文字列のルールの詳細については、<Teradata® Preprocessor2埋め込みSQLプログラマ ガイド、B035-2446>を参照してください。
  • PREPARE文のINTO句、USING句、およびFOR STATEMENT句については、DESCRIBEを参照してください。