ushidayの日記

主に「IBMi」のメモに・・・

SQL-RPGをチョット勉強 その2

前回の続きで、SQL-RPGで、1行ずつFetchして、社員名を表示する例

  • DDSの例
     A*****************************************************************
     A*   MSA00F   社員マスター             09/07/08  CSC         *
     A*****************************************************************
     A                                      UNIQUE
     A          R MSA00FR                   TEXT('社員マスター')
     A            MSA001         3S 0       COLHDG('社員コード')
     A*
     A            MSA002        32O         COLHDG('社員フリガナ')
     A            MSA003        16O         COLHDG('社員名')
     A            MSA004         8S 0       COLHDG('入社年月日')
     A            MSA005         1A         COLHDG('職務コード')
     A            MSA900         8S 0       COLHDG('作成日')
     A            MSA901         6S 0       COLHDG('作成時間')
     A            MSA902         8S 0       COLHDG('変更日')
     A            MSA903         6S 0       COLHDG('変更時間')
     A*KEY
     A          K MSA001                                               
     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
           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 MSA00F
                              ORDER BY MSA001 ;

              //カーソルオープン
              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(MSA00F)
     D                                     QUALIFIED
      /FREE

              //カーソル読み込み
              //単一行の取り出し
              EXEC SQL        FETCH NEXT FROM C1 INTO :ROW ;
              SELECT ;
              WHEN SQLSTT = '00000' ;   // 00000:操作正常終了
                  DSPLY (ROW.MSA003) ;
                  RETURN_VAR = *ON  ;
              WHEN SQLSTT = '02000' ;   // 02000:EOF
                  RETURN_VAR = *OFF ;
              OTHER ;                           //
                  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                                             

動的SQLの記述も出来る様ですが、まだ解説を見ておりません。