定義
- そのホスト言語の文で直接定義されている、ホスト言語変数
- Preprocessor2によって生成され、SQL内から間接的に定義されている、ホスト言語SQLベース構成
USINGリクエスト修飾子内のコロン接頭辞付き変数、およびストアド プロシージャのローカル変数とパラメータは、埋め込みSQLホスト変数と同様に機能します。
ホスト変数の目的
ホスト変数は、SQL文に入力値を提供するか、SQLリクエストから出力値を受け取ります。それらは、埋め込み式SQL文内の名前によって識別されます(例えば、Value-Var またはHostIn-Var)。
埋め込みSQL文内のホスト変数には、SQL BEGIN DECLARE SECTION文とEND DECLARE SECTION文との間で、アプリケーションのホスト言語で宣言された同じ名前のホスト変数と、1対1の関係があります。
ホスト変数の分類
ホスト変数は、メイン カテゴリと標識カテゴリに分類されます。
ホスト | このホスト変数の機能 |
---|---|
メイン変数 | Teradata Databaseとのデータの送受信に使用されます。 |
標識変数 | 次のいずれかを示します。
|
ホスト変数の処理
実行時に、Preprocessor2は指定したホスト入力変数から値を取り出し、処理するSQL文とともにそれらをTeradata Databaseに送信します。この機能は、関連データがあるTeradataの対話型SQL USING句や、パラメータがあるマクロ用のTeradata SQL EXEC文と似ています。
Teradata Databaseが、データを返すSQL文の結果をクライアント アプリケーション プログラムに返す場合、Preprocessor2は対応する値を、INTO句でリストされ、カンマによって区切られている指定されたホスト出力変数に送ります。
ホスト メイン変数は、ホスト標識変数と関連付けることもできます。
ホスト変数の使用のルール
ホスト変数の使用には、いくつかのルールが当てはまります。これらのルールのいくつかは、ホスト変数が使用される埋め込みSQL文には依存していません。
- すべてのホスト変数はコロン文字で始まらなければなりません。
コロン文字を指定して、変数とテーブル列参照とを区別します。例1:
SELECT * FROM table INTO :intofield1 WHERE COL1 = :hostvar1
これが実行されると、hostvar1の値は、定数が指定されたかのようにWHERE句に置き換えて入れられます。
例2:
SELECT :hostvar1, COL1, COL2 + :hostvar2 INTO :intofield1, :intofield2 INDICATOR :indvar1, :intofield3 INDICATOR :indvar2 FROM table WHERE COL3 = 'ABC'
実行時には、hostvar1およびhostvar2の値は、定数が指定されていたかのようにSELECTリストに置き換えて入れられます。
Teradataモードでは、ホスト変数(例えばintofieldn)の前にコロン文字を付けるかどうかはオプションですが、強く推奨されています。
- 次の例で、標識ホスト変数(indvar1およびindvar2)を指定するときは、最初のコロン文字が必須です。
この使用は、データを返す文のINTO句またはカーソル関連FETCH文と必ず関連付けられます。
SELECT column_1, column_2 INTO :intofield1 INDICATOR :indvar1, :intofield2 INDICATOR :indvar2 FROM table WHERE column_3 = 'ABC'
:indvarnは、関連付けられた:intofieldnがNULLかどうかを示し、文字およびバイト列データの場合は、Teradata Databaseサーバー データをフィールドに戻す場合に切り捨てが行なわれるかどうかを示します。
:intofieldnには、文の実行時にcolumn_nの値が入ります。column_n がNULLの場合、:intofieldnの値は不確定です。
- コロン文字の前後の埋め込み文字はオプション。個々の文のホスト変数でのコロン文字の使用法については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「SQLデータ操作言語文の構文規則」を参照してください。
- ホスト変数名は先頭が数値であってはなりません。
- ホスト変数名はプログラム内で固有にする必要があります。これは、Cで作成されたアプリケーションの場合は必須であり、COBOLおよびPL/Iで作成されたアプリケーションの場合も強く推奨されます。
- WHERE句では、ホスト変数を使用して、検索条件の値の指定や検索式のリテラルの置換を行ないます。
標識変数は、WHERE句で使用できます。
- SELECTリスト内のホスト変数は、式の一部として、またはそのものが単一の列を表わすように使用することができます。
- 標識変数は、SELECTリストでは使用できません。
- ホスト変数および標識変数は、INSERT文のVALUES句またはUPDATE文のSET句で使用することができます。
- ホスト変数をCHECKPOINT、DATABASE、およびLOGON文で使用して、コマンドを完成させる(つまりSQL文字列として)ことができます。
- ホスト変数は、データを返す文の出力を受け取るアプリケーション格納領域を識別するために使用することができます。
ホスト変数でのコロン文字の使用
ANSI/ISO SQL規格では、すべてのホスト変数でコロン文字を先行させて、SQL列参照と区別するように規定しています。そうしないと、あいまいになる可能性があるためです。
Teradata SQLでは、いくつかの状況で先行のコロン文字が必要ですが、すべての場合で必要なわけではありません。
最善の方法は、たとえセッションをTeradataモードで実行する場合でも、すべてのホスト変数の最初にコロン文字を使用することです。
Teradataモードで必須のコロン文字の使用
- ホスト変数名がSQL予約語である。
- ホスト変数が標識変数として使用される。
- 構文の使用があいまいで、名前が列参照またはホスト変数参照のいずれにもなり得る。
例えば、WHERE句のWHERE column_1 = field_1で、field_1はテーブルまたはホスト変数のどちらの列にもなり得る。
- 参照がDATABASE文にある(つまりDATABASE :var1)。
- 参照がSET CHARSET文のオブジェクトである。
- 参照がTeradata Database関数の引数である。例えば、ABS(:var_1)。
- 入力変数として使用する予定のCOBOL変数名の先頭(数値定数が予期されている)が数字(0-9)である。
- 参照が、リストされた項目のどれにも該当しない場所にある。
- UPDATE文のSET句またはWHERE句で指定されるホスト変数、およびMERGE文のmatch_condition、SET、またはINSERT句で指定されるホスト変数については、先行のコロン文字が必須。
Teradataモードでオプションのコロン文字の使用
- INTO句
- CONNECT文のIDまたはパスワード変数のいずれか
- DESCRIBE文またはPREPARE文のFOR STATEMENT句
- EXECUTE文またはOPEN文のUSING句
- EXECUTE文、FETCH文、またはOPEN文のDESCRIPTOR句
- LOGON文のオブジェクト
- EXECUTE IMMEDIATE文のオブジェクト
- INSERT文のVALUES句
- POSITION文のTO STATEMENT句
最善の方法は、たとえTeradataトランザクション モードでセッションを実行する場合でも、すべてのホスト変数の最初にコロン文字を使用することです。
動的SQLのホスト変数
動的SQLのホスト変数のサポートは、静的SQLでサポートされる場合と同じではありません。代わりに、動的SQLは、パラメータ マーカーとも呼ばれる、疑問符(?)プレースホルダー トークンを使用します。
この違いを例示する、以下の2つの例を考慮してください。
最初に、ホスト変数を使用する静的SQL INSERTがあります。2番目のものは同じ文ですが、ホスト変数の代わりにパラメータ マーカーを使用する動的SQL文として実行されます。
INSERT INTO parts VALUES (:part_no, :part_desc) INSERT INTO parts VALUES (?, ?)
関連トピック
- 「USINGリクエスト修飾子」のローカル変数およびパラメータについては、<Teradata Vantage™ SQLデータ操作言語、B035-1146>を参照してください。
- SQL文に入力値を提供するホスト変数については、入力ホスト変数を参照してください。SQLリクエストからの出力値の受け取りについては、出力ホスト変数を参照してください。
- ホスト標識変数の詳細については、標識変数のホスト メイン変数を参照してください。
- アプリケーションまたは標識変数でのNULLの処理については、標識変数を参照してください。Teradata SQLおよびコロン文字については、Teradataモードで必須のコロン文字の使用とTeradataモードでオプションのコロン文字の使用を参照してください。
- 動的SQL文でのプレースホルダーの使用について、PREPAREを参照してください。