この例では、SQLServiceサービスを使用してデータベースにクエリーを実行する方法を実証します。EXECUTEコマンドにSQLステートメントを作成するのではなく、SET PARAMETER(*SQL)コマンドを使用してSQLステートメントを事前に作成します。SET PARAMETER(*SQL)を使用せず、EXECUTEコマンドにSQLステートメントを作成するだけで同じクエリーを実行する方法を示すには、注釈が挿入されます。
この例では、JSMJDBC という IBM i のデータベースに接続します (これは IBM i の例であるため、データベース名はライブラリ名になります)。CONNECTコマンドで使用されるドライバー名は、SQLServiceプロパティ・ファイルで定義されるドライバー名とパスに相当します。アクセスするファイルはTBLNAMEとなります。これは、ID、NAME、AGE、SALARY、DEPT、GRADEの各フィールドで構成されます。
以下のような手順になります。
- JSMCOMMAND から返されるメッセージを処理するフィールドを定義します。
- クエリーから返される値を入れるフィールドを定義します。
- 作業リストを定義します。この作業リストの列は、ステップ 2 で作成したフィールドです。この作業リストが最終的にクエリからの結果のセットを保持します。
- SQLステートメントを入れるフィールドを定義します。
- SQLステートメントを入れる作業リストを定義します。これは 1 つの列のリストになり、使用されるフィールドはステップ 4 で定義したフィールドになります。
- JSM を開始し、SQLService をロードして、データベース・ドライバーに接続します。
- SQL ステートメントを作成して作業リストに配置します。
- SETコマンドを使用してSQLパラメータを保存します。キーワードPARAMETER(*SQL)を使用して、後から実行されるEXECUTEコマンドのSQLステートメントを入れる作業リストをこのコマンドで提供するように指定しています。また、SQLステートメントを入れる作業リストのフィールドを指定するために、SERVICE_LOADキーワードがこのコマンドに関連付けられている点にも注意してください。ここで指定するフィールド名は、このJSMコマンドのTO_GET部分の作業リストで定義されたフィールド名と同じでなければなりません。
- 次のステップは、コマンドの実行です。この例では、すでに作成されたSQLステートメントが使用されるため、QUERYキーワードに値*SQLPARAMETERが指定されます。また、サービス・リストはこのコマンドの一部として使用されます。つまり、このリストを使用して値が返されます。ここでサービス・リストに定義される列は、JSM_COMMAND組み込み関数の作業リストで定義された列と一致しなければなりません。
- 結果の表示後に、サービスとの接続を解除してJSMを閉じます。
* この例では SQLService を使ったデータベースのクエリが示されています。
* EXECUTE コマンドを書き込む代わりに、
* SET PARAMETER(*SQL) コマンドを使って
* SQL ステートメントを事前に作成します。
* この SET PARAMETER(*SQL) を利用せずに、
* EXECUTE コマンドを書くことで、同じクエリを実現する
* 方法は注意書きに示されています。
* 注意 1: この例は、JSMJDBC という名前の IBM i データベース
* に接続します。 (これは IBM i 例のため、
* このデータベース名はライブラリ名です。)
* CONNECT コマンドで使用されるドライバ名は、
* SQLService のプロパティ・ファイルに定義されたドライバ名とパスに
* 一致します。アクセスするファイルの名前はTBLNAME で、
* このファイルは、フィールド ID、NAME、AGE、SALARY、
* DEPT、GRADE のフィールドから構成されています。
FUNCTION OPTIONS(*DIRECT)
* 1. JSMCOMMAND から戻されるメッセージを
* 処理するフィールドを定義DEFINE FIELD(#JSMSTS) TYPE(*CHAR) LENGTH(020)DEFINE FIELD(#JSMMSG) TYPE(*CHAR) LENGTH(256)DEFINE FIELD(#JSMCMD) TYPE(*CHAR) LENGTH(256)
* 2. クエリから戻される値を
* 保持するフィールドを定義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)
* 3. 作業リストを定義
* この作業リストの列は、ステップ 2 で作成したフィールドで、
* 最終的には、クエリの結果セットを保持DEF_LIST NAME(#WRKLST) FIELDS(#COL1 #COL2 #COL3 #COL4) TYPE(*WORKING)DEF_LIST NAME(#BRWLST) FIELDS(#COL1 #COL2 #COL3 #COL4)
* 4. SQL ステートメントを保持するフィールドを定義DEFINE FIELD(#COLCMD) TYPE(*CHAR) LENGTH(100)
* 5. SQL ステートメントを保持する作業リストを定義
* この作業リストは 1 列のリストで、このフィールドは、
* ステップ 4 で定義したフィールド
DEF_LIST NAME(#WRKCMD) FIELDS(#COLCMD) TYPE(*WORKING)
* 6. JSM をオープン、SQLService をロードして開始し、
* データベース・ドライバに接続
USE BUILTIN(JSM_OPEN) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)USE BUILTIN(JSM_COMMAND) WITH_ARGS('SERVICE_LOAD SERVICE(SQLSERVICE) TRACE(*NO)') TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)CHANGE FIELD(#JSMCMD) TO('CONNECT DRIVER(DB2) DATABASE(JSMJDBC) USER(PERSON1) PASSWORD(BINGO)')USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
* 7. SQL ステートメントを準備し、
* 作業リストに入れるCHANGE FIELD(#COLCMD) TO('SELECT ID,NAME,AGE,SALARY FROM TBLNAME')ADD_ENTRY TO_LIST(#WRKCMD)
* 8. SET コマンドを使って SQL パラメータを保存 * PARAMETER(*SQL) のキーワードを使うことで、
* このコマンドから SQL ステートメントが格納された作業リストが
* 提供され、後で EXECUTE コマンドが実行されることを
* 示すことができます。CHANGE FIELD(#JSMCMD) TO('SET PARAMETER(*SQL) SERVICE_LIST(COLCMD)')USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG #WRKCMD)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG) *9. このコマンドを実際に実行 (EXECUTE)
*この例では、事前に準備した SQL ステートメントを
*使用するので、QUERY キーワードに対し
*値 *SQLPARAMETER が指定されています。
*また、このコマンドの一部としてサービスリストが使用されており、
*これは、値を再び戻し入れるために使われます。
*このサービスリストに定義された列は
*組み込み関数 JSM_COMMAND の作業リストに
*定義された列と一致しなければいけません。CHANGE FIELD(#JSMCMD) TO('EXECUTE QUERY(*SQLPARAMETER) SERVICE_LIST(COL1,COL2,COL3,COL4)')USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG #WRKLST)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
* 注:
* この SQL ステートメントを表現する別の方法として、
* EXECUTE コマンドに直接値を入れる方法があります。
* このアプローチの場合、プログラムの前半の
* SET コマンドを削除して、
* 次のように EXECUTE コマンドを書きます。
* CHANGE FIELD(#JSMCMD) TO('EXECUTE QUERY(SELECT ID,NAME,AGE,SALARY FROM TBLNAME) SERVICE_LIST(COL1,COL2,COL3,COL4)')SELECTLIST NAMED(#WRKLST)ADD_ENTRY TO_LIST(#BRWLST)ENDSELECTDISPLAY BROWSELIST(#BRWLST)
*10. 結果を表示後、サービスの接続を切断して、 * JSM を閉じます。USE BUILTIN(JSM_COMMAND) WITH_ARGS(DISCONNECT) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)USE BUILTIN(JSM_CLOSE) TO_GET(#JSMSTS #JSMMSG)EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
*サブルーチンSUBROUTINE NAME(CHECK) PARMS((#JSMSTS *RECEIVED) (#JSMMSG *RECEIVED))IF COND('#JSMSTS *NE OK')DISPLAY FIELDS(#JSMMSG)USE BUILTIN(JSM_CLOSE) TO_GET(#JSMSTS #JSMMSG)MENU MSGTXT('Java service error has occurred')ENDIFENDROUTINE