先に「415.超高速データ・ベースの読取りRPG」を紹介した。

なるほど高速での読取りが可能になったが
この例は内部記述ファイルの処理と同じで
DDS外部記述ファイルでは使えない。
つまりサンプルとしては動作できても実用的な
DDS外部記述の処理には使えないと思うかも知れないが
実は方法がある。
RPGに比べてC言語は高速で速く実行されると思いがとであるが
実はデータ・ベースの処理はRPGに優れていて
C言語でも外部記述処理ができ先に紹介した方法でも
外部記述として読み込方法があるのだが
その方法を使うと返って処理速度が低下してしまう。
先の例のようにバッファーのままの読取りであると
高速読取りが実現されるのである。
そこで高速を維持しつつ外部記述として処理できる
C言語とRPGの良さを両方取り持つハイブリッドな
方法を紹介しよう。
[ 超高速DDS読取りRPG : TESTREAD2 ]
ソースはこちらから
0001.00 H DFTNAME(TESTREAD2) DATEDIT(*YMD/)
0002.00 F********** 高速外部記述による読取り **********************************
0003.00 F*
0004.00 F**********************************************************************
0005.00
0006.00 * CRTBNDRPG OBJ(OBJLIB/TESTREAD2) SRCFILE(MYSRCLIB/QRPGLESRC)
0007.00 * DFTACTRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
0008.00
0009.00 *-------------------------------------------------------------------*
0010.00 * 2021/11/27 : 作成
0011.00 *-------------------------------------------------------------------*
0012.00 *( 作業変数 )
0013.00 D TRUE# S 4B 0 INZ(0)
0014.00 D FALSE# S 4B 0 INZ(-1)
0015.00 D EOF# S 4B 0 INZ(-1)
0016.00 D DFT C CONST(X'0B000100')
0017.00 D OE# C CONST(X'0E')
0018.00 D OF# C CONST(X'0F')
0019.00
0020.00 D*( _Ropen のプロトタイプ宣言 )
0021.00 *[ 例 ]
0022.00 * RFILE = _Ropen("ASNET.USR/USRLIBL", "rr")
0023.00 D Ropen PR * ExtProc('_Ropen')
0024.00 D RFILE * VALUE OPTIONS(*STRING:*TRIM)
0025.00 D OPTION * Value OPTIONS(*STRING:*TRIM)
0026.00
0027.00 D*( _Rreadn のプロトタイプ宣言 )
0028.00 * _RIOFB_T*_Rreadn(_RFILE *, void *, size_t, int);
0029.00 *[ 例 ]
0030.00 D Rreadn PR * ExtProc('_Rreadn')
0031.00 D RFILE * Value
0032.00 D RECORD * Value
0033.00 D RCD_LEN 10I 0 Value
0034.00 D OPT 10I 0 Value
0035.00
0036.00 D*( _Rclose のプロトタイプ宣言 )
0037.00 D Rclose PR 10I 0 ExtProc('_Rclose')
0038.00 D RFILE * Value
0039.00
0040.00 D IOFB_P S *
0041.00 D RIOFB DS 64 QUALIFIED
0042.00 D BASED(IOFB_P)
0043.00 D KEY *
0044.00 D SYSPRM *
0045.00 D RRN 10I 0
0046.00 D NUM_BYTE 10I 0
0047.00
0048.00 D RFILE DS 336 QUALIFIED
0049.00 D BASED(RFILE_P)
0050.00 D BUF_LENGTH 193 196I 0
0051.00
0052.00 D DATA E DS 5000 EXTNAME(CODEMST)
0053.00 D RCD_LEN S 10I 0
0054.00 D RFILE_P S *
0055.00 D BYTES S 10I 0
0056.00 D HIVAL S 1N INZ(*ON)
0057.00
0058.00 /FREE
0059.00 RFILE_P = Ropen('QTRFIL/CODEMST': 'rr');
0060.00 RCD_LEN = RFILE.BUF_LENGTH;
0061.00 DOW HIVAL;
0062.00 IOFB_P = Rreadn(RFILE_P: %ADDR(DATA): RCD_LEN: DFT);
0063.00 IF (RIOFB.NUM_BYTE = EOF#);
0064.00 LEAVE;
0065.00 ENDIF;
0066.00 EXSR CHECK;
0067.00 /END-FREE
0068.00 C********************************
0069.00 C* レコードの処理はここから *
0070.00 C********************************
0071.00 C EXSR PRINT
0072.00 C********************************
0073.00 C* レコードの処理はここまで *
0074.00 C********************************
0075.00 /FREE
0076.00 ENDDO;
0077.00 Rclose(RFILE_P);
0078.00 /END-FREE
0079.00 C SETON LR
0080.00 C RETURN
0081.00 C******************************************************
0082.00 C CHECK BEGSR
0083.00 C******************************************************
0084.00 C ENDSR
0085.00 C******************************************************
0086.00 C PRINT BEGSR
0087.00 C******************************************************
0088.00 C ENDSR
[コンパイル]
CRTBNDRPG PGM(TEST.COM/TESTREAD2) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
[解説]
プログラム: TESTREAD2 は先の TESTREAD と同じように
0062.00 IOFB_P = Rreadn(RFILE_P: %ADDR(DATA): RCD_LEN: DFT);
としてバッファー: DATA 単位で読み取っているのでやはり高速で処理される。
ところが
0052.00 D DATA E DS 5000 EXTNAME(CODEMST)
として DATA は ファイル: CODEMST とデータ構造で定義されているので
DATAにデータが読み止れれば即時に CODEMSTの全てのフィールドにも
値が更新されるという仕組みであり CODEMST の通常のフィールドで
演算することができる。
デバッグしてフィールドの値を調べてみればより確信することができる。
これはデータ・ベース CODEMST を読んでするのと同じことである。
この例のCODEMSTは約1万7千件のレコードがあるが
読取りは一瞬で終わってしまう。
つまり外部記述での超高速処理が実現できたことになる。
