GET コマンドを使って、ストアド・プロシージャ呼び出しから戻された値を取得する、もしくは準備したステートメントのパラメータ・リストからのエラーの行番号を取得することができます。
構文:
コマンド | キーワード | 値 | 開発者用メモ |
|---|---|---|---|
GET | OBJECT | *PARAMETERLISTROW | 必須。この値を使って、エラーが生じたリスト・エントリーを返します。 |
*PARAMETERCALL | ストアド・プロシージャの呼び出しパラメータを返す場合に使用されます。 | ||
*NEXTRESULT | 次の結果セットに移動する際に使用します。 |
コメント/警告
このコマンドは、パラメータ・リストを含むプリペアド・ステートメントが重複キー・エラーなどの例外を返した場合に特に役立ちます。このコマンドを使用すると、リスト内のどの行がエラーの原因なのかを解明できるため、正しい手段を講じることができます。
このコマンドを使用する場合、通常の流れは以下のようになります。
- ステップ 1: プリペアド・ステートメントを実行します。
- ステップ 2: 返されたステータスがOKの場合、処理を続行します。
- ステップ 3: 返されたステータスがOK以外の場合、GETコマンドを使用して、エラーの行を明確にします。
例
RDML
* INSERT ステートメント用のフィールド定義DEFINE FIELD(#COLCMD) TYPE(*CHAR) LENGTH(100)DEF_LIST NAME(#WRKCMD) FIELDS(#COLCMD) TYPE(*WORKING)*
* 作業リスト内で使用するフィールドを定義DEFINE FIELD(#COL1) TYPE(*CHAR) LENGTH(10)DEFINE FIELD(#COL2) TYPE(*CHAR) LENGTH(20)DEFINE FIELD(#COL3) TYPE(*DEC) LENGTH(8) DECIMALS(0)DEFINE FIELD(#COL4) TYPE(*DEC) LENGTH(12) DECIMALS(2)
* INSERT ステートメントで使用する、* 値を入れるための作業リストを定義DEF_LIST NAME(#WRKLST) FIELDS(#COL1 #COL2 #COL3 #COL4) TYPE(*WORKING) * バインド値の作成CHANGE FIELD(#COL1) TO(B2001)CHANGE FIELD(#COL2) TO('Tom')CHANGE FIELD(#COL3) TO(45)CHANGE FIELD(#COL4) TO(35000.60)ADD_ENTRY TO_LIST(#WRKLST)
* (**********)CHANGE FIELD(#COL1) TO(A2012)CHANGE FIELD(#COL2) TO('Antony')CHANGE FIELD(#COL3) TO(45)CHANGE FIELD(#COL4) TO(35000.60)ADD_ENTRY TO_LIST(#WRKLST)
* INSERT の準備CHANGE FIELD(#COLCMD) TO('INSERT INTO TBLNAME(ID,NAME,AGE,SALARY) VALUES(?,?,?,?)')ADD_ENTRY TO_LIST(#WRKCMD)CHANGE FIELD(#JSMCMD) TO('SET PARAMETER(*SQL) ') Service_List(COLCMD)USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG #WRKCMD)
* 挿入する日付を含むリストを準備CHANGE FIELD(#JSMCMD) TO('SET PARAMETER(*LIST) SERVICE_LIST(COL1,COL2,COL3,COL4)')USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG #WRKLST)*
* 準備したステートメントを実行CHANGE FIELD(#JSMCMD) TO('EXECUTE PREPARED(*SQLPARAMETER)')USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG)
* エラー発生の場合、問題の行を検知するIF COND('#JSMSTS *NE OK')CHANGE FIELD(#JSMCMD) TO('GET OBJECT(*PARAMETERLISTROW)')USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG)*DISPLAY FIELDS(#JSMMSG)ENDIF
RDMLX
* JSM コマンドおよびメッセージ・フィールドの定義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)
* INSERT ステートメント用のフィールド定義Define Field(#COLCMD) Type(*CHAR) Length(100)Def_List Name(#WRKCMD) Fields(#COLCMD) Type(*WORKING)
* クエリから返される結果セットを含むフィールドとリストを定義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(0)Def_List Name(#WRKLST) Fields(#COL1 #COL2 #COL3) Type(*WORKING) * バインド値の作成#COL1 := 'B2001'#COL2 := 'Tom'#COL3 := 45#COL4 := 35000.60Add_Entry To_list(#Wrklst) #COL1 := 'B2002'#COL2 := 'Jones'#COL3 := 23#COL4 := 22000.60Add_Entry To_list(#Wrklst)
* INSERT の準備#COLCMD := 'Insert Into TBLNAME(ID,NAME,AGE,SALARY) VALUES(?,?,?,?)'Add_Entry To_list(#Wrkcmd)#JSMCMD := 'Set Parameter(*SQL)'Use Builtin(JSMX_COMMAND) With_Args(#JSMHND #JSMCMD) To_Get(#JSMSTS #JSMMSG #WRKCMD)
* 挿入する日付を含むリストを準備#JSMCMD := 'Set Parameter(*LIST)'Use Builtin(JSMX_COMMAND) With_Args(#JSMHND #JSMCMD) To_Get(#JSMSTS #JSMMSG #WRKLST)
* 準備したステートメントを実行#JSMCMD := 'Execute Prepared(*SQLPARAMETER)'Use Builtin(JSMX_COMMAND) With_Args(#JSMHND #JSMCMD) To_Get(#JSMSTS #JSMMSG) If '#JSMSTS *ne Ok'
* エラーが発生した場合は、問題のある行を見つけます。Get コマンドは #JSMMSG フィールドに行番号を返します。#JSMCMD := 'Get Object(*PARAMETERLISTROW)'Use Builtin(JSMX_COMMAND) With_Args(#JSMHND #JSMCMD) To_Get(#JSMSTS #JSMMSG)ENDIF