アプリケーション開発の手引き


REXX のホスト変数

ホスト変数は、SQL ステートメント内で参照される REXX の言語変数です。これにより、アプリケーションは入力データを DB2 に渡し、また DB2 から出力データを受け取ることができます。 REXX アプリケーションは LOB ロケーターおよび LOB ファイル参照変数を除き、ホスト変数を宣言する必要はありません。ホスト変数のデータ・タイプおよびサイズは、変数の参照の実行時に決定されます。ホスト変数の命名および使用の際には、以下の規則を適用してください。

REXX でのホスト変数の命名

正しく命名された REXX 変数は、すべてホスト変数として使用できます。変数名の長さは 64 文字までです。ピリオドを変数名の最後の文字として使用しないでください。ホスト変数名には、英字、数字、および @、_、!、.、?、$ といった文字を使用できます。

REXX でのホスト変数の参照

REXX インタープリターは、プロシージャー内のストリングで引用符で囲まれていないものをすべて検査します。ストリングが現行の REXX 変数プール内の変数を表している場合には、 REXX がそのストリングを現行値と置き換えます。以下に、REXX におけるホスト変数の参照方法を示します。

     CALL SQLEXEC 'FETCH C1 INTO :cm' 
     SAY 'Commission = ' cm 

文字ストリングが数値データ・タイプに変換されないようにするため、ストリングを以下の例のように単一引用符で囲んでください。

     VAR = '100' 

REXX は、3 バイトの文字ストリング 100 に変数 VAR をセットします。単一引用符がストリングの一部になっている場合は、次の例に従ってください。

     VAR = "'100'" 

CHARACTER フィールドに数値データを挿入する場合、REXX インタープリターは、数値データを整数データとみなします。したがって、数値ストリングを明示的に連結して、単一引用符で囲む必要があります。

REXX の標識変数

REXX における標識変数のデータ・タイプは、10 進小数点を持たない数です。以下に、INDICATOR キーワードを使用した REXX における標識変数の例を示します。

     CALL SQLEXEC 'FETCH C1 INTO :cm INDICATOR :cmind' 
     IF ( cmind < 0 ) 
        SAY 'Commission is NULL' 

上記の例では、cmind が負の値かどうか検査されます。負の値ではない場合、アプリケーションは cm の戻り値を使用することができます。負の値の場合、取り出される値は NULL で、cm は使用されません。この場合、データベース・マネージャーはホスト変数の値を変更しません。

事前定義 REXX 変数

SQLEXEC、SQLDBS および SQLDB2 は一定の操作の結果として、事前定義 REXX 変数をセットします。それらの変数は以下のとおりです。

RESULT
各操作により、戻りコードがセットされます。使用される値は以下のとおりです。
n
n は、フォーマットされたメッセージのバイト数を示す正の値です。この値を戻すのは GET ERROR MESSAGE API のみです。
0
API が実行されています。REXX 変数 SQLCA には、API の完了状況が含まれます。 SQLCA.SQLCODE がゼロでない場合は、その値に関連したテキスト・メッセージが SQLMSG に含まれます。
-1
API を完了するために十分なメモリーがありません。要求されたメッセージは戻されません。
-2
SQLCA.SQLCODE が 0 にセットされます。メッセージは戻されません。
-3
SQLCA.SQLCODE に無効な SQLCODE が含まれています。メッセージは戻されません。
-6
SQLCA REXX 変数が作成できません。これは、十分なメモリーがないか、または何らかの理由で REXX 変数プールが使用できないということを示します。
-7
SQLMSG REXX 変数が作成できません。これは、十分なメモリーがないか、または何らかの理由で REXX 変数プールが使用できないということを示します。
-8
REXX 変数プールから SQLCA.SQLCODE REXX 変数を取り出すことができません。
-9
取り出しの際に、SQLCA.SQLCODE REXX 変数の切り捨てが行われました。この変数の長さは最大 5 バイトまでです。
-10
SQLCA.SQLCODE REXX 変数を、ASCII から有効な長整数に変換できません。
-11
REXX 変数プールから SQLCA.SQLERRML REXX 変数を取り出すことができます。
-12
取り出しの際に、SQLCA.SQLERRML REXX 変数の切り捨てが行われました。この変数の長さは最大 2 バイトまでです。
-13
SQLCA.SQLERRML REXX 変数を、ASCII から有効な短整数に変換できません。
-14
REXX 変数プールから SQLCA.SQLERRMC REXX 変数を取り出すことができません。
-15
取り出しの際に、SQLCA.SQLERRMC REXX 変数の切り捨てが行われました。この変数の長さは最大 70 バイトまでです。
-16
エラー・テキストに指定された REXX 変数をセットできません。
-17
REXX 変数プールから SQLCA.SQLSTATE REXX 変数を取り出すことができません。
-18
取り出しの際に、SQLCA.SQLSTATE REXX 変数の切り捨てが行われました。この変数の長さは最大 2 バイトまでです。

注:-8 〜 -18 の値を戻すのは、GET ERROR MESSAGE API のみです。

SQLMSG
SQLCA.SQLCODE が 0 でない場合、この値にはエラー・コードに関連したテキスト・メッセージが含まれます。

SQLISL
分離レベルです。使用される値は以下のとおりです。
RR
反復可能読み取り。
RS
読み取り固定。
CS
カーソル固定。これが省略時値です。
UR
非コミット読み取り。
NC
コミットなし (NC は、一部の AS/400 サーバーでしかサポートされていません)。

SQLCA
SQL ステートメントの処理の後に更新された SQLCA 構造と、DB2 API が呼び出されます。この構造の項目については、管理 API 解説書 で説明されています。

SQLRODA
CALL ステートメントを使用して呼び出される、ストアード・プロシージャーの入出力 SQLDA 構造です。データベース・アプリケーション・リモート・インターフェース (DARI) API を使用して呼び出される、出力 SQLDA ストアード・プロシージャーでもあります。この構造の項目については、管理 API 解説書 で説明されています。

SQLRIDA
データベース・アプリケーション・リモート・インターフェース (DARI) API を使用して呼び出される、ストアード・プロシージャーの入力 SQLDA 構造です。この構造の項目については、管理 API 解説書 で説明されています。

SQLRDAT
データベース・アプリケーション・リモート・インターフェース (DARI) API を使用して呼び出される、サーバー・プロシージャーの SQLCHAR 構造です。この構造の項目については、管理 API 解説書 で説明されています。

REXX の LOB ホスト変数

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 ロケーター・ホスト変数の宣言の構文を示します。

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'

REXX における LOB ファイル参照宣言

アプリケーション内で 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 つのフィールドに相当します。

hv3.FILE_OPTIONS.
アプリケーションによりセットされ、ファイルの使用法を指示します。
hv3.DATA_LENGTH.
DB2 によりセットされ、ファイルのサイズを指示します。
hv3.NAME.
アプリケーションにより、LOB ファイルの名前に設定されます。

FILE_OPTIONS の場合は、アプリケーションが以下のキーワードを設定します。

キーワード (整数値)
意味
READ (2)
ファイルが入力に使用されます。オープン、読み取り、クローズできるのは、正規のファイルです。ファイル内のデータの長さは、 (アプリケーションの要求側のコードにより) ファイルのオープン時に計算されます。
CREATE (8)
出力において、新しいファイルを作成します。ファイルがすでに存在している場合はエラーとなります。ファイルの長さ (バイト単位) は、ファイル参照変数構造の DATA_LENGTH フィールドに戻されます。
OVERWRITE (16)
出力において、ファイルがすでに存在する場合はそれを上書きし、そうでない場合は新しいファイルを作成します。ファイルの長さ (バイト単位) は、ファイル参照変数構造の DATA_LENGTH フィールドに戻されます。
APPEND (32)
ファイルがすでに存在する場合はそこに出力が追加され、そうでない場合は新しいファイルが作成されます。ファイルに追加されるデータ (ファイル全体の長さではない) の長さ (バイト単位) は、ファイル参照変数構造の DATA_LENGTH フィールドに戻されます。
注:REXX では、ファイル参照ホスト変数は複合変数です。したがって、NAMENAME_LENGTH、および FILE_OPTIONS フィールドは、宣言するだけでなく、値も設定しなければなりません。

REXX での LOB ホスト変数のクリア

OS/2 では、プログラムの終了後も効力を持つ REXX SQL LOB ロケーターおよびファイル参照ホスト変数宣言を、明示的にクリアしなければならない場合があります。これは、実行中のセッションがクローズされるまでアプリケーション・プロセスが終了しないためです。 REXX SQL LOB 宣言がクリアされないと、 LOB アプリケーションの実行後に同一セッション内で実行されている他のアプリケーションの妨げになります。

宣言をクリアする構文を示します。

     CALL SQLEXEC "CLEAR SQL VARIABLE DECLARATIONS" 

このステートメントは、LOB アプリケーションの終端にコーディングしなければなりません。直前のアプリケーションで宣言がクリアされていない場合があるので、宣言をクリアするための回避的な手段として、このステートメントを任意の場所にコーディングできます (たとえば、REXX SQL アプリケーションの最初)。


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