先日IBM iのTR3(テクノロジーリフレッシュ)が、発表されリリースされました。
その中で、SQL文にてLIMIT OFFSETが使える様になったと有ったので、試してみました。
サンプルは以下のソースです
SQLFET1.rpgle
H DATEDIT(*YMD)
H COPYRIGHT('(C) CHUBU SYSTEM CO,.LTD 1996 - ')
/IF DEFINED(*CRTBNDRPG)
H DFTACTGRP(*NO) ACTGRP(*CALLER)
/ENDIF
D*-----<<メインプロシージャ・プロトタイプ定義>>-----*
D*-----<<サブプロシージャ・プロトタイプ>>-----*
D OPEN_CURSOR PR N
D FETCH_CURSOR PR N
D CLOSE_CURSOR PR N
D*-----<<変数>>-----*
D******************************************************************
D*
C*------------------------------------------------------------------*
C*---------<< FREE FORMAT >>-------*
C*------------------------------------------------------------------*
/FREE
// 1行ずつのFETCH (NEXT:順読み)
IF NOT OPEN_CURSOR() ;
// OPEN ERROR DEFINED
DSPLY ('CURSOR OPEN ERROR') ;
ELSE ;
DOW FETCH_CURSOR() ;
ENDDO ;
CLOSE_CURSOR() ;
ENDIF ;
*INLR = *ON ;
RETURN ;
/END-FREE
P****************************************************************
P** < OPEN_CURSOR > :カーソルオープン処理 **
P**------------------------------------------------------------**
P** RETURN : *ON=正常オープン,*OFF=エラー **
P**------------------------------------------------------------**
P****************************************************************
P OPEN_CURSOR B
D OPEN_CURSOR PI N
D*<変数>
D RETURN_VAR S N
/FREE
//カーソル定義
EXEC SQL DECLARE C1 CURSOR FOR
SELECT *
FROM USHIDA/ITEM
ORDER BY CODE
LIMIT 10 OFFSET 5 ;
//カーソルオープン
EXEC SQL OPEN C1 ;
IF SQLSTT = '00000' ; // 00000:操作正常終了
RETURN_VAR = *ON ;
ELSE ;
RETURN_VAR = *OFF;
ENDIF ;
RETURN RETURN_VAR ;
/END-FREE
P E
P****************************************************************
P** < FETCH_CURSOR > :カーソル読取処理 **
P**------------------------------------------------------------**
P** RETURN : *ON=正常読取,*OFF=EOF又はエラー **
P**------------------------------------------------------------**
P****************************************************************
P FETCH_CURSOR B
D FETCH_CURSOR PI N
D*<変数>
D RETURN_VAR S N
D ROW E DS EXTNAME(ITEM)
D QUALIFIED
D LINE S 40A
/FREE
//カーソル読み込み
EXEC SQL FETCH NEXT FROM C1 INTO :ROW ;
SELECT ;
WHEN SQLSTT = '00000' ; // 00000:操作正常終了
LINE = %CHAR(ROW.CODE) + ' ' + ROW.NAME ;
DSPLY ( LINE ) ;
RETURN_VAR = *ON ;
WHEN SQLSTT = '02000' ; // 02000:EOF
// DSPLY (SQLSTT) ;
RETURN_VAR = *OFF ;
OTHER ; //
// DSPLY (SQLSTT) ;
RETURN_VAR = *OFF ;
ENDSL ;
RETURN RETURN_VAR ;
/END-FREE
P E
P****************************************************************
P** < CLOSE_CURSOR > :カーソルクローズ処理 **
P**------------------------------------------------------------**
P** RETURN : *ON=正常クローズ.*OFF=エラー **
P**------------------------------------------------------------**
P****************************************************************
P CLOSE_CURSOR B
D CLOSE_CURSOR PI N
D*<変数>
D RETURN_VAR S N
/FREE
//カーソルクローズ
EXEC SQL CLOSE C1 ;
SELECT ;
WHEN SQLSTT = '00000' ; // 00000:操作正常終了
RETURN_VAR = *ON ;
OTHER ; //
RETURN_VAR = *OFF ;
ENDSL ;
RETURN RETURN_VAR ;
/END-FREE
P E
開始コードが6から10件取得出来ているので、RPGで使えてます。
iナビでも使えましたが、STRSQLでは何故かLIMITのみでOFFSETを指定するとエラーになりました。
Webで使用する時は、フレームワークでラップされているため、意識しないですが。