ルール - 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

動的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文として実行することはできません。