上記の SQLストアド・プロシージャーに代わるユーザー独自のストアド・プロシージャーを
RPG プログラムとして簡単に開発することもできます。
しかも、パフォーマンスに優れ、ユーザー独自の機能も自由に追加することができます。
ユーザー独自のストアド・プロシージャーを作成すれば拡張性に富んだ業務を構築することができます。
RPGSET: 担当者マスターを読み取って表示する
H DFTNAME(RPGSET) DATEDIT(*YMD/) F********** ストアド・プロシージャー結果セット ********************** FTANTOM IF E K DISK USROPN F********************************************************************** D TANDTA E DS EXTNAME(QTRFIL/TANTOM) D RECDTA 1 512 D RCDDTA DS OCCURS(9999) D VAR1 1 1024 D LCLVAR DS D N 1 4B 0 C OPEN TANTOM C 1 DO *HIVAL N C READ TANTOM C IF %EOF C LEAVE C ENDIF C N OCCUR RCDDTA C MOVEL TANDTA RCDDTA C ENDDO C CLOSE TANTOM C/EXEC SQL SET RESULT SETS ARRAY :RCDDTA FOR :N ROWS C/END-EXEC C SETON LR C RETURN
解説
コンパイル
SQL文が RPGソースにバインドされている、SQLRPGLE であるために CRTBNDRPG や
CRTRPGMOD プロシージャーでコンパイルすることはできません。
CRTSQLRPGI コマンドを使って次のようにコンパイルしてください。
SQLRPGI のコンパイル
CRTSQLRPGI OBJ(QTROBJ/RPGSET) SRCFILE(QTRSRC/QRPGLESRC) COMMIT(*NONE)
もし、*MODULE を作成したいのであれば次のように *MODULE を作成してください。
CRTSQLRPGI OBJ(QTROBJ/RPGSET) SRCFILE(QTRSRC/QRPGLESRC) COMMIT(*NONE) OBJTYPE(*MODULE)
プロシージャーの作成
*PGM タイプのストアド・プロシージャーを作成するには *PGM に対してさらに
プロシージャーを作成する必要があります。
A.対話式SQL( IBMプロダクト)が導入されている場合
STRSQL + [実行] によって対話式SQLを稼働させてから
CREATE PROCEDURE MYOBJLIB/P1() LANGUAGE RPGLE
EXTERNAL NAME 'QTROBJ/RPGSET'
のように実行してください。
この例ではライブラリー QTROBJ のプログラム: RPGSET をライブラリー MYOBJLIB の
プロシージャー P1 として登録することを意味しています。
CREATE は作成だけを意味していますので、ターゲットとなるプロシージャー P1 が
既に存在している場合は、この CREATE 命令はエラーになります。
存在していた場合は置換えたいのであれば
CREATE OR REPLACE PROCEDURE ....
のように記述します。
削除する場合は
DROP PROCEDURE QTROBJ/P1
のように DROP命令を使います。
作成されたプロシージャーは DSPLIB, DSPOJ, ... などのような IBM i コマンドで
参照して確認することはできません。
B. 対話式SQL が導入されていない場合
1. SQLソース・ファイルを次のように作成してください。
CRTSRCPF FILE(QTRSRC/QSQLSRC) RCDLEN(112) IGCDTA(*YES) CCSID(65535) AUT(*ALL)
2. 次に SEU を使って以下ように入力して、このソースを保管します。
CREATE PROCEDURE MYOBJLIB/P1() LANGUAGE RPGLE
EXTERNAL NAME 'QTROBJ/RPGSET'
(例では P1 という名前で保管します。)
3. RUSQLSTM コマンドを使って、このSQL文を実行して
CREATE PROCEDURE を実行してプロシージャー P1 を作成します。
RUNSQLSTM SRCFILE(QTRSRC/QSQLSRC) SRCMBR(P1) COMMIT(*NONE)
RUNSQLSTM を実行して何もメッセージが出力されない場合はコンパイルは成功で、
プロシージャーは作成されています。(作成されているかどうかは確認することはできません。)
もしエラーが発生すれば印刷スプール・ファイルにエラー・リストが出力されていますので
中身を確認して修正してください。
C. DDS へのプロシージャーの指定
DDS ソースには PROC="MYLIB/PRIC" のようにプロシージャー名を追記してください。
A TKTNCD R B 12 25REFFLD(@TANTOM/TACODE QTRFIL/TANTOM) A TEXT('*COMBO *KEY' PROC="MYLIB/P1") A TTNAMJ R O +2REFFLD(@TANTOM/TTNAMJ QTRFIL/TANTOM) A TEXT('*COMBO *DATA' PROC="MYLIB/P1")
解説
PROC指定によって AutoWebクライアントはプロシージャー名も併せて
ODBCドライバーに要求します。
D. SQLバインド・プローシージャーの書き方
RPG による直接、データ・ベースの読取りではなく、やはり読取りも SQL文によって行うこともできます。
SQLSET: SQLバインドRPG によるストアド・プロシージャー
H DEBUG DFTNAME(SQLSET) DATEDIT(*YMD/) F********** SQL 担当者マスター一覧表 ***************************** F* F***************************************************************** D*( データ・ベース外部データ構造 ) D FMT001 E DS EXTNAME(TANTOM) D RCDDTA DS OCCURS(9999) D VAR1 1 1024 D N S 4B 0 C****************************************************** C* SQL 文のカーソルの前準備 C****************************************************** C* SELECT 文によってカーソル C1 を用意 C/EXEC SQL DECLARE C1 CURSOR FOR C+ SELECT T1.TACODE, T1.TTNAMJ FROM QTRFIL/TANTOM T1 C+ ORDER BY T1.TACODE C/END-EXEC C* カーソルをオープン C/EXEC SQL OPEN C1 C/END-EXEC C****************************************************** C* 明 細 演 算 C****************************************************** C/EXEC SQL WHENEVER NOT FOUND GOTO EOF C/END-EXEC C 1 DO *HIVAL N C N OCCUR RCDDTA C/EXEC SQL C+ FETCH C1 INTO :TACODE, :TTNAMJ C/END-EXEC C*( 明細印刷 ) C* TACODE CAT(P) TTNAMJ:0 RCDDTA C MOVEL(P) TACODE RCDDTA C CAT TTNAMJ:0 RCDDTA C/EXEC SQL SET RESULT SETS ARRAY :RCDDTA FOR :N ROWS C/END-EXEC C ENDDO C EOF TAG C* カーソルをクローズ C/EXEC SQL CLOSE C1 C/END-EXEC C END TAG C SETON LR C****************************************************** C *INZSR BEGSR C****************************************************** C* 初期のみの実行 C CLEAR FMT001 C INZEND ENDSR
解説
データ・ベースの読取りは
SELECT T1.TACODE, T1.TTNAMJ FROM QTRFIL/TANTOM T1
ORDER BY T1.TACODE
によって行います。
各レコードを N OCCUR RCDDTA によって配列指標をセットしてから
FETCH によって
FETCH C1 INTO :TACODE, :TTNAMJ
に一行ずつ取り出して配列 RCDDTA に保管しておきます。
すべてを読み終えたら
SQL SET RESULT SETS ARRAY :RCDDTA FOR :N ROWS
によって N行分のデータを ODBCドライバーに渡すのは前と同じです。
このRPGプログラムは担当者マスター(TANTOM)を読み取って、 RCDDTA という 9999 個の
要素から成る配列に保管して、その結果を ODBC に渡します。
また、このプログラムは SQL文を含んでいるためソース・タイプは RPGLE ではなく
SQLRPGLE としておきます。
※SQLRPGLE の開発および実行のために IBMプロダクトとしての
SQL (5761ST1 *COMPATIBLE DB2 QUERY MGR AND SQL DEVKIT)が
導入されている必要はありません。
プログラムの実行は、AURORA_EGN 上で実行されますので
ライブラリー・リストに頼ることはできません。
したがって、EXTNAME でライブラリーつきのファイル名を指定してから明示的に
OPEN, CLOSE を行えるように USROPN で定義しています。
担当者マスター(TANTOM)をオープンしたら READ TANTOM で %EOF になるので
DO *HIVAL で繰り返して読み続けます。
担当者マスター・レコードを読んだら N OCCUR RCDDTA で 配列 RCDDTA の
N番目の配列要素にセットして MOVEL TANDTA RCDDTA で配列要素に保管しておきます。
すべてのレコードを読み終えた担当者マスター(TANTOM)を CLOSE TANTOM でクローズします。
すべての配列は N個読んだはずですので N個の配列を結果セットとして
ODBCドライバーに渡すために
SQL SET RESULT SETS ARRAY :RCDDTA FOR :N ROWS
という SQL文を実行してプログラムを終了します。
ODBCドライバーは、この結果セットを受け取って XML形式で AutoWebクライアントに渡します。