LoginSignup
1
1

More than 5 years have passed since last update.

先日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 

●SQLRPG実行結果の画面ショット
2015-12-01_134150.png

開始コードが6から10件取得出来ているので、RPGで使えてます。
iナビでも使えましたが、STRSQLでは何故かLIMITのみでOFFSETを指定するとエラーになりました。
Webで使用する時は、フレームワークでラップされているため、意識しないですが。

●iナビの実行画面
2015-12-01_135036.png

●STRSQLの実行画面
2015-12-01_135155.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1