SQL 解説書

ホスト変数の参照

ホスト変数 とは、以下のいずれかです。

または

これらは、SQL ステートメントで参照されています。 ホスト変数はホスト言語のステートメントによって直接定義されるか、 または SQL 拡張機能を使って間接的に定義されます。

SQL ステートメント内のホスト変数は、 ホスト変数宣言規則に従ってプログラム内に記述されたホスト変数を識別する必要があります。

SQL ステートメントで使用されるホスト変数はすべて、 REXX を除くすべてのホスト言語の SQL DECLARE セクションで 宣言する必要があります (アプリケーション・プログラムで SQL ステートメントのホスト変数を宣言する場合の 詳細については、アプリケーション開発の手引き を参照してください)。

SQL DECLARE セクションで宣言されている変数と同じ名前の変数を、 SQL DECLARE セクションの外部で宣言することはできません。 SQL DECLARE セクションは、BEGIN DECLARE SECTION で始まり、 END DECLARE SECTION で終わります。

メタ変数の host-variable (ホスト変数) が構文図の中で使われる場合、 それはホスト変数への参照を示します。 VALUES INTO 文節または、FETCH か SELECT INTO ステートメントの INTO 文節のホスト変数は、 行の中の列の値または式の値が割り当てられるホスト変数を識別するものです。 その他の文脈でのホスト変数は、 アプリケーション・プログラムからデータベース・マネージャーに渡される値を指定します。

動的 SQL におけるホスト変数

動的 SQL ステートメントにおいては、 ホスト変数の代わりにパラメーター・マーカーが使用されます。

パラメーター・マーカーは疑問符 (?) で表されます。 これは、動的 SQL ステートメントにおいてアプリケーションが値を提供する位置、 すなわち、ステートメント・ストリングが静的 SQL ステートメントであるとすれば、 ホスト変数が来ることになる位置を示します。 以下に、ホスト変数を使った静的 SQL ステートメントの例を示します。

     INSERT INTO DEPARTMENT
      VALUES (:hv_deptno, :hv_deptname, :hv_mgrno, :hv_admrdept)

次に、パラメーター・マーカーを使った動的 SQL ステートメントの例を示します。

      INSERT INTO DEPARTMENT VALUES (?, ?, ?, ?)

パラメーター・マーカーについては、 PREPAREの『パラメーター・マーカー』の項を参照してください。

構文図におけるメタ変数 host-variable (ホスト変数) は、 一般に以下のように展開されます。

>>-:host-identifier----+-------------------+----------------------------------><
        | .-INDICATOR-.     |
        '-+-----------+--:host-identifier--'
 

host-identifier (ホスト識別子) は、 ソース・プログラムの中で宣言される必要があります。 2 番目のホスト識別子で指定される変数は、 データ・タイプが短精度整数のものでなければなりません。

最初のホスト識別子 (host-identifier) は、 メイン変数 を指定します。

演算に応じて、このホスト識別子はデータベース・マネージャーに値を提供したり、 またはデータベース・マネージャーから提供される値を受け取ったりします。 入力ホスト変数は、実行時アプリケーション・コード・ページの値を提供します。 出力ホスト変数には、データが出力アプリケーション変数にコピーされるときに、 必要に応じて実行時アプリケーション・コード・ページに変換される値が提供されます。 指定されるホスト変数は、同じプログラム内で入力変数と出力変数の両方として機能できます。

2 番目の host-identifier (ホスト識別子) は、その標識変数 を示します。 標識変数の目的は以下のとおりです。

たとえば、:HV1:HV2 を使用して挿入値または更新値を指定する場合に、 HV2 が負であると、指定される値はヌル値になります。 HV2 が負でない場合、指定される値は HV1 の値です。

同様に、:HV1:HV2 が VALUES INTO 文節、 または FETCH あるいは SELECT INTO ステートメントに指定され、 しかも戻された値がヌル値である場合には、HV1 は変更されず、HV2 は負の値に設定されます。 26 戻された値がヌル値でない場合は、その値が HV1 に割り当てられ、 HV2 はゼロに設定されます。(ただし、 HV1 への割り当てに非 LOB ストリングのストリング切り捨てが必要になる場合を除きます。 この場合 HV2 はストリングの元の長さに設定されます。) 割り当て時に時刻の秒の部分の切り捨てが必要な場合、HV2 は秒数に設定されます。

2 番目のホスト識別子が省略されている場合は、ホスト変数は標識変数を持たないことになります。 ホスト変数参照 :HV1 によって指定される値は、常に HV1 の値であり、変数にヌル値を割り当てることはできません。 したがって、この形式は、対応する列でヌル値を使えない場合以外は、INTO 文節では使用しないでください。 この形式が使用された場合に、列にヌル値が含まれていると、 データベース・マネージャーは実行時にエラーを生成します。

ホスト変数を参照する SQL ステートメントは、 対象のホスト変数の宣言の範囲内にある必要があります。 カーソルの SELECT ステートメントで参照されるホスト変数の場合、 この規則は DECLARE CURSOR ステートメントではなく、OPEN ステートメントに適用されます。

PROJECT 表を使用し、プロジェクト (PROJNO) 'IF1000' について、 ホスト変数 PNAME (VARCHAR(26)) はプロジェクト名 (PROJNAME) に、 ホスト変数 STAFF (dec(5,2)) はスタッフ配置の平均レベル (PRSTAFF) に、 ホスト変数 MAJPROJ (char(6)) は主要プロジェクト (MAJPROJ) に設定します。 PRSTAFF と MAJPROJ 列はヌル値である可能性があるため、 標識変数 STAFF_IND (短精度整数) と MAJPROJ_IND (短精度整数) を使用します。

  SELECT PROJNAME, PRSTAFF, MAJPROJ
    INTO :PNAME, :STAFF :STAFF_IND, :MAJPROJ :MAJPROJ_IND
    FROM PROJECT
    WHERE PROJNO = 'IF1000'

MBCS の考慮事項: ホスト変数名にマルチバイト文字を使用できるかどうかは、ホスト言語によって決まります。

BLOB、CLOB、および DBCLOB のホスト変数の参照

通常の BLOB、CLOB、および DBCLOB の変数、 LOB のロケーター変数 (ロケーター変数の参照を参照)、 および LOB ファイル参照変数 (BLOB、CLOB、および DBCLOB ファイル参照変数の参照を参照) は、 すべてのホスト言語の中で定義可能です。 LOB が可能な場所では、構文図の host-variable (ホスト変数) という用語は、 通常のホスト変数、ロケーター変数、またはファイル参照変数を指します。 これらはネイティブのデータ・タイプではないため、SQL 拡張機能が使用され、 それぞれの変数を表現するのに必要なホスト言語構成をプリコンパイラーが生成します。 REXX の場合、LOB はストリングにマップされます。

ラージ・オブジェクト値全体を保持できるほど大きい変数を定義することのできる場合もあります。 このような場合で、サーバーからのデータ転送を据え置いてもパフォーマンス上のメリットが期待できない場合は、 ロケーターを使用する必要はありません。 しかし、ホスト言語やスペースの制限により、 ラージ・オブジェクト全体を一度に一時記憶に保管するのが難しい場合がよくありますし、 パフォーマンス上のメリットを考え合わせた上で、 ラージ・オブジェクトはロケーターによって参照し、 一度にラージ・オブジェクトの一部分だけを保持するホスト変数にオブジェクトの一部を選択して割り当て、 そこで更新するという方法を採用することもできるかもしれません。

他のすべてのホスト変数と同様に、 ラージ・オブジェクトのロケーター変数にも標識変数を対応させることができます。 ラージ・オブジェクトのロケーター・ホスト変数に対応する標識変数は、 他のデータ・タイプの標識変数と同じように動作します。 データベースからヌル値が戻されると、標識変数が設定され、 ロケーター・ホスト変数は変更されません。 つまり、ロケーターがヌル値を指すことはないということです。


脚注:

26
DFT_SQLMATHWARN を yes にしてデータベースが構成されている場合 (または静的 SQL ステートメントのバインドの過程である場合)、 HV2 を -2 にすることができます。 HV2 が -2 である場合、HV1 の数値タイプへの変換エラー、 または HV1 の値を判別するために使用される演算式の評価エラーにより、 HV1 の値を戻すことができません。 DB2 ユニバーサル・データベースのバージョン 5 より前のクライアント・バージョンを使用してデータベースにアクセスする場合、 HV2 は算術例外に対して -1 になります。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]