例1 - SET PARAMETER(*SQL)コマンドの使用
この例では、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の各フィールドで構成されます。
以下のステップを行います。
1. JSMCOMMANDから返されるメッセージを処理するフィールドを定義します。
2. クエリーから返される値を入れるいくつかのフィールドを定義します。
3. 作業リストを定義します。このリストの列は、ステップ2で作成されたフィールドになります。最終的にクエリーからの結果セットが入ります。
4. SQLステートメントを入れるフィールドを定義します。
5. SQLステートメントを入れる作業リストを定義します。これは1つの列のリストであり、使用されるフィールドはステップ4で定義したフィールドになります。
6. JSMを開始し、SQLServiceをロードして、データベース・ドライバーに接続します。
7. SQLステートメントを作成して作業リストに配置します。
8. SETコマンドを使用してSQLパラメータを保存します。キーワードPARAMETER(*SQL)を使用して、後から実行されるEXECUTEコマンドのSQLステートメントを入れる作業リストをこのコマンドで提供するように指定しています。また、SQLステートメントを入れる作業リストのフィールドを指定するために、SERVICE_LOADキーワードがこのコマンドに関連付けられている点にも注意してください。ここで指定するフィールド名は、このJSMコマンドのTO_GET部分の作業リストで定義されたフィールド名と同じでなければなりません。
9. 次のステップでは、実際にコマンドを実行します。この例では、すでに作成されたSQLステートメントが使用されるため、QUERYキーワードに値*SQLPARAMETERが指定されます。また、サービス・リストはこのコマンドの一部として使用されます。つまり、このリストを使用して値が返されます。ここでサービス・リストに定義される列は、JSM_COMMAND組み込み関数の作業リストで定義された列と一致しなければなりません。
10. 結果の表示後に、サービスとの接続を解除してJSMを閉じます。
* This example demonstrates how to use the SQLService to
* query a database. The SET PARAMETER(*SQL)
* command is used to create an SQL statement
* in advance instead of writing it into the EXECUTE command.
* A note is included to show how you could achieve the
* same query simply by writing the SQL statement
* into the EXECUTE command without using the SET PARAMETER(*SQL).
*
* Note 1: This example connects to a
*
IBM
i database called JSMJDBC. (Since this is a
* IBM
i example, the database name is a library name.)
* The driver name used in the CONNECT command corresponds
* to the driver name and path defined in the SQLService
* properties file. The file being accessed is called
* TBLNAME and it consists of the fields ID, NAME, AGE,
* SALARY, DEPT, and GRADE.
FUNCTION OPTIONS(*DIRECT)
* 1. Define the fields to handle the messages to be
* returned from the JSMCOMMANDs
DEFINE FIELD(#JSMSTS) TYPE(*CHAR) LENGTH(020)
DEFINE FIELD(#JSMMSG) TYPE(*CHAR) LENGTH(255)
DEFINE FIELD(#JSMCMD) TYPE(*CHAR) LENGTH(255)
* 2. Define some fields that will hold the values to be
* returned from the query
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. Define a working list whose columns are the fields
* created in step 2. This working list will eventually
* hold the result set from the query
DEF_LIST NAME(#WRKLST) FIELDS(#COL1 #COL2 #COL3 #COL4) TYPE(*WORKING)
DEF_LIST NAME(#BRWLST) FIELDS(#COL1 #COL2 #COL3 #COL4)
* 4. Define a field that will hold the SQL statement
DEFINE FIELD(#COLCMD) TYPE(*CHAR) LENGTH(100)
* 5. Define a working list that will hold the SQL
* statement. This will be a single column list and the
* field used will be that defined in Step 4
DEF_LIST NAME(#WRKCMD) FIELDS(#COLCMD) TYPE(*WORKING)
* 6. Start OPEN JSM, LOAD the SQLService, then
* CONNECT to the database driver
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(ALICK) PASSWORD(MEL123)')
USE BUILTIN(JSM_COMMAND) WITH_ARGS(#JSMCMD) TO_GET(#JSMSTS #JSMMSG)
EXECUTE SUBROUTINE(CHECK) WITH_PARMS(#JSMSTS #JSMMSG)
* 7. Prepare the SQL statement then place it in
* a working list
CHANGE FIELD(#COLCMD) TO('SELECT ID,NAME,AGE,SALARY FROM TBLNAME')
ADD_ENTRY TO_LIST(#WRKCMD)
* 8. Use the SET command to store the SQL parameter.
* You will note that the PARAMETER(*SQL) keyword
* is used to indicate that this command provides
* a working list that will hold the SQL statement
* for the EXECUTE command to be executed later
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. The next step is to actually EXECUTE the comand.
* You will note in this example, since an already
* prepared SQL statement is being used, a value of
* *SQLPARAMETER is specified for the QUERY keyword.
* You will also notice that a service list is used as a
* part of this command - this is used to receive the
* values back into. The columns defined in the service
* list here must match the columns defined in the working
* list for the JSM_COMMAND Built In Function.
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)
* NOTE:
* Another way to express this SQL statement could have
* been to place it directly into the EXECUTE command.
* With this approach, you would remove the SET command
* earlier in the program and rewrite the EXECUTE command
* as follows:
* 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)
ENDSELECT
DISPLAY BROWSELIST(#BRWLST)
* 10. After displaying the results, you will disconnect
* the service and then close 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)
* SUB ROUTINES
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')
ENDIF
ENDROUTINE