READ
READコマンドは、EXECUTEコマンドで指定されたSQLステートメントから返される結果セットを読み込む場合に使用されます。このコマンドでは、SET PARAMETER(*MAP)コマンドで提供されるフィールドと列のマッピングを使用します。
結果リストを受け取る作業リストがEXECUTEコマンドにない場合、EXECUTEコマンドはREADコマンドでアクセスするまでサーバー上に残ります。
予想されるレコードの数が作業リストのサイズや幅を超える場合、READコマンドを使用する必要があります。READコマンドでは、サーバーから停止したレコードの数を常に減らすことができます。例えば、SQL結果が20,000レコードを返す場合、そのレコードを1,000のセットに読み込み、割り当てられるリソースの量を減らすと便利になります。
また、RDML作業リストの最大幅が256文字の例もあります。文字幅300の結果セットが予想される場合、この結果セットをEXECUTEコマンドの一部として作業リストに返すことはできません。この場合、READコマンドを使用して、管理可能なチャンクでレコードを取り出します。必要に応じて、複数のREADを発行し、文字幅が256未満のリストに結果を配置できます。
READ ------------ SCROLL ---------- *YES ----------------------|
*NO
キーワード
SCROLL |
このキーワードは、次の読み込み用に新しい行と古い行のどちらを選択するかを指定する場合に使用されます。 以下の2つのオプションがあります。 · *YES - リスト引数はデータで埋められ、前方にスクロールします。 · *NO - リスト引数はデータで埋められ、前方にスクロールしません。 この詳細については、「コメント/警告」を参照してください。 省略値は*YESです。 |
コメント/警告
READコマンドは、SET PARAMETER(*MAP)コマンドで提供されるフィールドと列のマッピングを使用して現在の結果セットを読み込みます。作業リストのフィールドは列にマッピングされ、これらの列のデータは作業リストのフィールドにマッピングされます。
上記のように、このREADコマンドの機能により、管理可能なチャンク単位で情報にアクセスできます。SCROLLキーワードでは、以降のREADで同じレコードの新しい列をこの現在の読み込みとして取得するか、あるいはレコードの次のセットの列を取得するかを決めることができます。つまり、以下のようになります。
· *YES - READで指定された列を選択する場合、次の読み込みで完全に新しいレコードのセットから列を取り出すように前方へスクロールします。
· *NO - READで列を選択する場合、次のREADで同じ行の新しい列を選択できるように前方へスクロールしません。
前方へスクロールするレコードの数は、作業リストのエントリー数として定義される数になります。
リストと変数
このコマンドでは、取得された値が返される際の作業リストを指定する必要があります。作業リストに定義された列は、この特定のREADで取得する列になります。これらのフィールドと、リモート・テーブルの実際のフィールドとの関係は、SET PARAMETER(*MAP)コマンドで設定されます。
この仕組みについて確認するには、以下の例とSQLServiceの例を参照してください。RDML、RDMLX、または3GLアプリケーションのサービス・コマンドに作業リストを指定する方法については、「Java Service Managerクライアント」を参照してください。
例
SQLServiceサービスのSET、EXECUTE、READの各コマンドは、それぞれ緊密に関連しています。そのため、「SQLServiceの例」の拡張例を確認することをお勧めします。
RDML
* Define the JSM command and message fields
DEFINE FIELD(#JSMSTS) TYPE(*CHAR) LENGTH(020)
DEFINE FIELD(#JSMMSG) TYPE(*CHAR) LENGTH(256)
DEFINE FIELD(#JSMCMD) TYPE(*CHAR) LENGTH(256)
* Define the fields and the list that will be used to indicate the field/column mappings
DEFINE FIELD(#FIELD) TYPE(*CHAR) LENGTH(010)
DEFINE FIELD(#COLUMN) TYPE(*CHAR) LENGTH(030)
DEF_LIST NAME(#MAPLST) FIELDS(#FIELD #COLUMN) TYPE(*WORKING)
* Define the fields and the lists that the queried data will be returned back into
DEFINE FIELD(#COL1) TYPE(*CHAR) LENGTH(010)
DEFINE FIELD(#COL2) TYPE(*CHAR) LENGTH(020)
DEFINE FIELD(#COL3) TYPE(*DEC) LENGTH(008) DECIMALS(0)
DEFINE FIELD(#COL4) TYPE(*DEC) LENGTH(012) DECIMALS(2)
DEF_LIST NAME(#WRKLST1) FIELDS(#COL1 #COL3) TYPE(*WORKING)
DEF_LIST NAME(#WRKLST2) FIELDS(#COL1 #COL2 #COL4) TYPE(*WORKING)
* Define the mapping
CHANGE FIELD(#FIELD) TO(COL1)
CHANGE FIELD(#COLUMN) TO(ID)
ADD_ENTRY TO_LIST(#MAPLST)
CHANGE FIELD(#FIELD) TO(COL2)
CHANGE FIELD(#COLUMN) TO(NAME)
ADD_ENTRY TO_LIST(#MAPLST)
CHANGE FIELD(#FIELD) TO(COL3)
CHANGE FIELD(#COLUMN) TO(AGE)
ADD_ENTRY TO_LIST(#MAPLST)
CHANGE FIELD(#FIELD) TO(COL4)
CHANGE FIELD(#COLUMN) TO(SALARY)
ADD_ENTRY TO_LIST(#MAPLST)
CHANGE FIELD(#JSMCMD) TO('SET PARAMETER(*MAP) SERVICE_LIST(FIELD,COLUMN)')
USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG #MAPLST)
CHANGE FIELD(#JSMCMD) TO('EXECUTE QUERY(SELECT ID,NAME,AGE,SALARY FROM TBLNAME)')
USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG)
USE BUILTIN(JSM_COMMAND) WITH_ARGS('READ SERVICE_LIST(COL1,COL3) SCROLL(*NO)') TO_GET(#JSMSTS #JSMMSG #WRKLST1)
USE BUILTIN(JSM_COMMAND) WITH_ARGS('READ SERVICE_LIST(COL1,COL2,COL4)') TO_GET(#JSMSTS #JSMMSG #WRKLST2)
RDMLX
* Define the JSM command and message fields
Define Field(#JSMSTS) Type(*CHAR) Length(020)
Define Field(#JSMMSG) Type(*CHAR) Length(256)
Define Field(#JSMCMD) Type(*CHAR) Length(256)
Define Field(#JSMHND) Type(*Char) Length(4)
* Define the fields and the list that will be used to indicate the field/column mappings
Define Field(#FIELD) Type(*Char) Length(010)
Define Field(#COLUMN) Type(*Char) Length(030)
Def_List Name(#MAPLST) Fields(#FIELD #COLUMN) Type(*Working)
* Define the fields and the lists that the queried data will be returned back into
Define Field(#COL1) Type(*Char) Length(010)
Define Field(#COL2) Type(*Char) Length(020)
Define Field(#COL3) Type(*Dec) Length(008) Decimals(0)
Define Field(#COL4) Type(*Dec) Length(012) Decimals(2)
Def_List Name(#WRKLST1) Fields(#COL1 #COL3) Type(*Working)
Def_List Name(#WRKLST2) Fields(#COL1 #COL2 #COL4) Type(*Working)
* Define the mapping
#FIELD := COL1
#COLUMN := ID
Add_Entry To_List(#MAPLST)
#FIELD := COL2
#COLUMN := NAME
Add_Entry To_List(#MAPLST)
#FIELD := COL3
#COLUMN := AGE
Add_Entry To_List(#MAPLST)
#FIELD := COL4
#COLUMN := SALARY
Add_Entry To_List(#MAPLST)
#JSMCMD := 'Set Parameter(*Map) Service_List(FIELD,COLUMN)'
Use Builtin(JSMX_COMMAND) With_Args(#JSMHND #JSMCMD) To_Get(#JSMSTS #JSMMSG #MAPLST)
* Run the Query
#JSMCMD := 'Execute Query(Select ID,NAME,AGE,SALARY From TBLNAME)'
Use Builtin(JSMX_COMMAND) With_Args(#JSMHND #JSMCMD) To_Get(#JSMSTS #JSMMSG)
* Read the columns 1 & 3 (which hold ID and AGE)
Use Builtin(JSMX_COMMAND) With_Args(#JSMHND 'Read Service_List(COL1,COL3) Scroll(*NO)') To_Get(#JSMSTS #JSMMSG #WRKLST1)
* Read the columns 1, 2, & 4 (which hold ID, NAME, and SALARY)
Use Builtin(JSMX_COMMAND) With_Args(#JSMHND 'Read Service_List(COL1,COL2,COL4) Scroll(*NO)') To_get(#JSMSTS #JSMMSG #WRKLST2)