ホスト変数は、SQL ステートメント内で参照される REXX の言語変数です。これにより、アプリケーションは入力データを DB2 に渡し、また DB2 から出力データを受け取ることができます。 REXX アプリケーションは LOB ロケーターおよび LOB ファイル参照変数を除き、ホスト変数を宣言する必要はありません。ホスト変数のデータ・タイプおよびサイズは、変数の参照の実行時に決定されます。ホスト変数の命名および使用の際には、以下の規則を適用してください。
正しく命名された REXX 変数は、すべてホスト変数として使用できます。変数名の長さは 64 文字までです。ピリオドを変数名の最後の文字として使用しないでください。ホスト変数名には、英字、数字、および @、_、!、.、?、$ といった文字を使用できます。
REXX インタープリターは、プロシージャー内のストリングで引用符で囲まれていないものをすべて検査します。ストリングが現行の REXX 変数プール内の変数を表している場合には、 REXX がそのストリングを現行値と置き換えます。以下に、REXX におけるホスト変数の参照方法を示します。
CALL SQLEXEC 'FETCH C1 INTO :cm' SAY 'Commission = ' cm
文字ストリングが数値データ・タイプに変換されないようにするため、ストリングを以下の例のように単一引用符で囲んでください。
VAR = '100'
REXX は、3 バイトの文字ストリング 100 に変数 VAR をセットします。単一引用符がストリングの一部になっている場合は、次の例に従ってください。
VAR = "'100'"
CHARACTER フィールドに数値データを挿入する場合、REXX インタープリターは、数値データを整数データとみなします。したがって、数値ストリングを明示的に連結して、単一引用符で囲む必要があります。
REXX における標識変数のデータ・タイプは、10 進小数点を持たない数です。以下に、INDICATOR キーワードを使用した REXX における標識変数の例を示します。
CALL SQLEXEC 'FETCH C1 INTO :cm INDICATOR :cmind' IF ( cmind < 0 ) SAY 'Commission is NULL'
上記の例では、cmind が負の値かどうか検査されます。負の値ではない場合、アプリケーションは cm の戻り値を使用することができます。負の値の場合、取り出される値は NULL で、cm は使用されません。この場合、データベース・マネージャーはホスト変数の値を変更しません。
SQLEXEC、SQLDBS および SQLDB2 は一定の操作の結果として、事前定義 REXX 変数をセットします。それらの変数は以下のとおりです。
注: | -8 〜 -18 の値を戻すのは、GET ERROR MESSAGE API のみです。 |
REXX ホスト変数に LOB 列を取り出してくる場合、この列は単純 (つまり、カウントはされない) ストリングとして保管されます。これは、文字ベースの SQL タイプ (たとえば、CHAR、VARCHAR、GRAPHIC、LONG など) すべてと同じ方法で処理されます。入力では、ホスト変数の内容のサイズが 32K を超える場合、または以下に説明する基準を満たしている場合には、適切な LOB タイプが割り当てられます。
REXX SQL では、以下に示すホスト変数のストリングの内容により、LOB タイプが決定されます。
ホスト変数のストリングの内容 | 使用される LOB タイプ |
---|---|
:hv1='通常の引用符付きストリングが 32K を超えている' | CLOB |
:hv2="'組み込み区切り引用符 "," 付きのストリングが 32K を超えている'" | CLOB |
:hv3="G'G で開始する組み込み区切り単一引用符 "," 付きの DBCS が 32K を超えている'" | DBCLOB |
:hv4="BIN'BIN で開始する組み込み区切り単一引用符 "," 付きのストリングが任意の長さである'" | BLOB |
REXX における LOB ロケーター・ホスト変数の構文は、REXX における LOB ロケーター・ホスト変数の宣言の構文を示します。
REXX における LOB ロケーター・ホスト変数の構文 .-,-------------------. V | >>-DECLARE-----:--variable-name---+---LANGUAGE TYPE--+-BLOB---+---LOCATOR--> +-CLOB---+ '-DBCLOB-' >--------------------------------------------------------------><
アプリケーション内で LOB ロケーター・ホスト変数を宣言しなければなりません。これらの宣言が出てくると、REXX/SQL はプログラムのそれ以降の部分で、宣言されたホスト変数をロケーターとして取り扱います。ロケーターの値は、内部形式で REXX 変数に保管されます。
以下に例を示します。
CALL SQLEXEC 'DECLARE :hv1, :hv2 LANGUAGE TYPE CLOB LOCATOR'
エンジンから戻された LOB により表現されるデータは、以下に示す形式の FREE LOCATOR ステートメントを使用して、 REXX/SQL 内で解放することができます。
FREE LOCATOR ステートメントの構文 .-,-------------------. V | >>-FREE--LOCATOR-----:--variable-name---+----------------------><
以下に例を示します。
CALL SQLEXEC 'FREE LOCATOR :hv1, :hv2'
アプリケーション内で LOB ファイル参照ホスト変数を宣言しなければなりません。これらの宣言が出てくると、REXX/SQL はプログラムのそれ以降の部分で、宣言されたホスト変数を LOB ファイル参照として取り扱います。
REXX における LOB ファイル参照変数の構文は、REXX における LOB ファイル参照ホスト変数の宣言の構文を示します。
REXX ファイル参照宣言 .-,-------------------. V | >>-DECLARE-----:--variable-name---+---LANGUAGE TYPE--+-BLOB---+---FILE--> +-CLOB---+ '-DBCLOB-' >--------------------------------------------------------------><
以下に例を示します。
CALL SQLEXEC 'DECLARE :hv3, :hv4 LANGUAGE TYPE CLOB FILE'
REXX におけるファイル参照変数には、3 つのフィールドが含まれます。上記の例では、以下のものがその 3 つのフィールドに相当します。
FILE_OPTIONS の場合は、アプリケーションが以下のキーワードを設定します。
注: | REXX では、ファイル参照ホスト変数は複合変数です。したがって、NAME、NAME_LENGTH、および FILE_OPTIONS フィールドは、宣言するだけでなく、値も設定しなければなりません。 |
OS/2 では、プログラムの終了後も効力を持つ REXX SQL LOB ロケーターおよびファイル参照ホスト変数宣言を、明示的にクリアしなければならない場合があります。これは、実行中のセッションがクローズされるまでアプリケーション・プロセスが終了しないためです。 REXX SQL LOB 宣言がクリアされないと、 LOB アプリケーションの実行後に同一セッション内で実行されている他のアプリケーションの妨げになります。
宣言をクリアする構文を示します。
CALL SQLEXEC "CLEAR SQL VARIABLE DECLARATIONS"
このステートメントは、LOB アプリケーションの終端にコーディングしなければなりません。直前のアプリケーションで宣言がクリアされていない場合があるので、宣言をクリアするための回避的な手段として、このステートメントを任意の場所にコーディングできます (たとえば、REXX SQL アプリケーションの最初)。