ユーザー独自のプログラムの作成

見出しのアイコン

上記の 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

解説

この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クライアントに渡します。

コンパイル

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ドライバーに渡すのは前と同じです。