REXX SQL アプリケーションは、SQL CALL ステートメントを使用して、データベース・サーバーでストアード・プロシージャーを呼び出せます。ストアード・プロシージャーは、AIX システム上の REXX を除き、そのサーバー上でサポートされる任意の言語で作成することができます。 (クライアント・アプリケーションは AIX 上の REXX で作成できますが、他の言語と同様、AIX 上の REXX で作成されたストアード・プロシージャーを呼び出すことはできません。)
CALL ステートメントを使用すると、クライアント・アプリケーションがサーバー・ストアード・プロシージャーとの間でデータをやりとりできるようになります。入出力データ用のインターフェースは、ホスト変数のリストになっています (詳しくは、SQL 解説書 を参照)。 REXX は一般に、ホスト変数のタイプとサイズをその内容に基づいて判別するため、 CALL に渡される出力専用変数は予期出力と同じタイプとサイズを持つダミーのデータを用いて初期化されます。
データは、CALL ステートメントの USING DESCRIPTOR 構文を使用し、
SQLDA REXX 変数を介して、ストアード・プロシージャーに渡されます。
表 36 に SQLDA が設定される方法を示します。表の中の ':value' は、アプリケーションに必要な値を含む REXX ホスト変数のステムです。
DESCRIPTOR の場合、'n' は SQLDA の特定の sqlvar 要素を示す数値です。右側の数値は、表 36 の下の注意事項に対応しています。
表 36. CALL ステートメントを使用したストアード・プロシージャーの、クライアント側の REXX SQLDA
USING DESCRIPTOR | :value.SQLD | 1 |
|
|
|
| :value.n.SQLTYPE | 1 |
|
|
|
| :value.n.SQLLEN | 1 |
|
|
|
| :value.n.SQLDATA | 1 |
|
| 2 |
| :value.n.SQLDIND | 1 |
|
| 2 |
注:
SQL CALL ステートメントが実行されると、データベース・マネージャーは記憶域を割り振り、 REXX 変数プールから REXX 変数の値を取り出します。 CALL ステートメントで使用される SQLDA では、データベース・マネージャーは、SQLTYPE および SQLLEN 値に基づいて、記憶域を SQLDATA および SQLIND フィールドに割り振ります。
REXX ストアード・プロシージャーの場合 (つまり、呼び出されるプロシージャーが OS/2 REXX で作成されている)、クライアントにより CALL ステートメントまたは DARI API のいずれかのタイプから渡されるデータは、以下の事前定義名を使用してデータベース・サーバーの REXX 変数プールに入れられます。
CALL ステートメントでホスト変数を使用するときは、サーバー・プロシージャーからホスト変数に戻されるデータすべてと互換性のあるタイプの値に、各ホスト変数を初期化してください。この初期化は、対応する標識が負であっても実行しなければなりません。
記述子を使用するときは、SQLDATA を初期化して、サーバー・プロシージャーから戻されるデータすべてと互換性のあるタイプのデータを含める必要があります。この初期化は、SQLIND フィールドに負の値が入っていても実行しなければなりません。
事前定義された出力 sqlda SQLRODA の SQLDATA フィールドおよび SQLIND (ヌル値可タイプの場合) のすべてが初期化されていることを確認してください。たとえば、SQLRODA.SQLD が 2 の場合、(たとえ、対応する標識が負で、データがクライアントに戻されなくても) 次のフィールドには同じデータが入っているはずです。
REXX プログラムで SQLDA 出力を初期化した場合、データベース・マネージャーから戻された SQLDA 構造から 10 進フィールドの精度と位取り値を取り出すには、 sqllen.scale 値と sqllen.precision 値を使用します。以下はその例です。
. . . /* INITIALIZE ONE ELEMENT OF OUTPUT SQLDA */ io_sqlda.sqld = 1 io_sqlda.1.sqltype = 485 /* DECIMAL DATA TYPE */ io_sqlda.1.sqllen.scale = 2 /* DIGITS RIGHT OF DECIMAL POINT */ io_sqlda.1.sqllen.precision = 7 /* WIDTH OF DECIMAL */ io_sqlda.1.sqldata = 00000.00 /* HELPS DEFINE DATA FORMAT */ io_sqlda.1.sqlind = -1 /* NO INPUT DATA */ . . .