4.3.8.3 さらに最適化した例

さらに最適化するため、FETCHコマンドをエミュレートし、本当に必要な場合にのみ入出力処理を発生させるサブルーチンを使うと次のようになります。

GROUP_BY   NAME(#TRANS) FIELDS(#TRANNUM #TRANDATE #TRANTIME 
           #TRANTYPE #TRANDESC #TRANUSER #TRANSTATE #STATDESC)

SELECT     FIELDS(#TRANS) FROM_FILE(TRANS)
EXECUTE    SUBROUTINE(GET_STATE) WITH_PARMS(#TRANSTATE)
EXECUTE    SUBROUTINE(GET_TYPE)  WITH_PARMS(#TRANTYPE)
UPRINT     FIELDS(#TRANS)
ENDSELECT

SUBROUTINE NAME(GET_STATE) PARMS((#GETSTATE *RECEIVED))
DEFINE     FIELD(#GETSTATE) REFFLD(#STATCODE)
DEF_LIST   NAME(#STATES) FIELDS(#STATCODE #STATDESC) 
           TYPE(*WORKING) ENTRYS(10)
LOC_ENTRY  IN_LIST(#STATES) WHERE('#STATCODE = #GETSTATE')
IF_STATUS  IS_NOT(*OKAY)
FETCH      FIELDS(#STATES) FROM_FILE(STATES) 
           WITH_KEY(#GETSTATE)
ADD_ENTRY  TO_LIST(#STATES)
ENDIF
ENDROUTINE

SUBROUTINE NAME(GET_TYPE) PARMS((#GETTYPE *RECEIVED))
DEFINE     FIELD(#GETTYPE) REFFLD(#TRANTYPE)
DEF_LIST   NAME(#TRNTYP) FIELDS(#TRANTYPE #TRANDESC) 
           TYPE(*WORKING) ENTRYS(50)
LOC_ENTRY  IN_LIST(#TRNTYP) WHERE('#TRANTYPE = #GETTYPE')
IF_STATUS  IS_NOT(*OKAY)
FETCH      FIELDS(#TRNTYP) FROM_FILE(TRNTYP) WITH_KEY(#GETTYPE)
ADD_ENTRY  TO_LIST(#TRNTYP)
ENDIF
ENDROUTINE

 

このサブルーチンは、新しい状態コードや取引タイプがTRANSファイル中に現れた場合にのみ、実際にファイルにアクセスして説明記述を取得するようになっています。

TRANSファイルに例えば状態コードが3通り、取引タイプが5通り現れるとすれば、1万のレコードがあっても、データベースには、(10000 + 3 + 5) = 10008回アクセスすればよいことになります。これは19992回分の入出力処理の削減に相当します。したがって実行時間は約3分の1になりました。