DB2 for i에서도 LIMIT OFFSET

5474 단어 db2ILE-RPGSQLIBMiRPG
요 전날 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 실행 결과의 스크린 샷


시작 코드가 6에서 10건 취득되어 있으므로 RPG로 사용할 수 있습니다.
i 내비게이션에서도 사용할 수 있었습니다만, STRSQL에서는 어째서인가 LIMIT만으로 OFFSET를 지정하면 에러가 되었습니다.
웹에서 사용할 때는 프레임 워크로 래핑되어 있기 때문에 의식하지 않습니다.

●i 내비게이션 실행 화면


● STRSQL 실행 화면

좋은 웹페이지 즐겨찾기