Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@ushiday

DB2 for iでもLIMIT OFFSET

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?