ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

B.5 拡張カーソルを使用したカーソル操作の使用例

拡張カーソルを使用したカーソル操作の使用例を以下に示します。

000010 IDENTIFICATION   DIVISION.
000020 PROGRAM-ID.      DYNCUR.
000030 DATA             DIVISION.
000040 WORKING-STORAGE  SECTION.
000050*
000060      EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000070 01  SQLSTATE     PIC X(5).
000080 01  SQLMSG       PIC X(255).
000090 01  STRSQL.
000100   49  STRSQL-L   PIC S9(4)  BINARY.
000110   49  STRSQL-D   PIC X(28).
000120 01  CMD.
000130   49  CMD-L      PIC S9(4)  BINARY.
000140   49  CMD-D      PIC X(5).
000150 01  CUR.
000160   49  CUR-L      PIC S9(4)  BINARY.
000170   49  CUR-D      PIC X(5).
000180 01  COUNTRY.
000190   49  COUNTRY-L  PIC S9(4)  BINARY.
000200   49  COUNTRY-D  PIC X(100).
000210 01  COUNTRY_NUM PIC S9(4)  BINARY.
000220      EXEC SQL END DECLARE SECTION END-EXEC.
000230*
000240 01  ENDFLAG      PIC X(2).
000250 01  INDATA       PIC X(2).
000260 01  INNUM        PIC S9(2).
000270 01  LOOP         PIC S9(2).
000280*
000290 PROCEDURE DIVISION.
000300*
000310      EXEC SQL WHENEVER SQLERROR GOTO :CONNECT-ERROR END-EXEC.
000320      EXEC SQL WHENEVER NOT FOUND GOTO :NOT-FOUND-ERROR END-EXEC.
000330      EXEC SQL CONNECT TO 'DB01' END-EXEC.
000340*
000350      EXEC SQL WHENEVER SQLERROR GOTO :STM-ERROR END-EXEC.
000360      EXEC SQL WHENEVER NOT FOUND GOTO :NOT-FOUND-ERROR END-EXEC.
000370*
000380     PERFORM TEST BEFORE
000390             VARYING LOOP FROM 0 BY 1
000400             UNTIL LOOP > 9
000410*
000420         MOVE LOOP TO INDATA
000430         STRING "SELECT COUNTRY FROM SCH.TBL" INDATA DELIMITED BY "#"
000440                 INTO STRSQL-D
000450         MOVE FUNCTION LENG(STRSQL-D) TO  STRSQL-L
000460*
000470         STRING "CMD" INDATA  DELIMITED BY "#"
000480                 INTO CMD-D
000490         MOVE FUNCTION LENG(CMD-D) TO  CMD-L
000500         STRING "CUR" INDATA  DELIMITED BY "#"
000510                 INTO CUR-D
000520         MOVE FUNCTION LENG(CUR-D) TO  CUR-L
000530*
000540         EXEC SQL PREPARE :CMD FROM :STRSQL END-EXEC
000550*
000560         EXEC SQL ALLOCATE :CUR CURSOR FOR :CMD END-EXEC
000570     END-PERFORM.
000580*
000590      EXEC SQL WHENEVER NOT FOUND GOTO :NODATA END-EXEC.
000600*
000610 GET-DATA.
000620      DISPLAY  "何番目の表のデータを表示するか入力してください (0-9)>> ".
000630      ACCEPT  INNUM.
000640      IF  INNUM < 0  AND  INNUM > 9
000650          DISPLAY  "入力されたデータに誤りがあります"
000660        GO  TO  GET-DATA
000670      END-IF.
000680*
000690      MOVE INNUM TO INDATA.
000700      STRING "CUR" INDATA  DELIMITED BY "#"
000710                  INTO CUR-D.
000720      MOVE FUNCTION LENG(CUR-D) TO  CUR-L.
000730      EXEC SQL OPEN :CUR END-EXEC.
000740*
000750     PERFORM TEST BEFORE
000760             VARYING COUNTRY_NUM FROM 1 BY 1
000770             UNTIL COUNTRY_NUM < 0
000780        EXEC SQL FETCH :CUR INTO :COUNTRY END-EXEC
000790        DISPLAY  COUNTRY_NUM "件目の国名は" COUNTRY-D "です"
000800     END-PERFORM.
000810*
000820 NODATA.
000830      EXEC SQL CLOSE :CUR END-EXEC.
000840      EXEC SQL COMMIT WORK END-EXEC.
000850*
000860      DISPLAY "終了しますか?(Y/y) >>".
000870      ACCEPT  ENDFLAG.
000880      IF  ENDFLAG NOT = "Y"  AND  ENDFLAG NOT = "y"
000890        GO  TO  GET-DATA
000900      END-IF.
000910*
000920      EXEC SQL COMMIT WORK END-EXEC.
000930      EXEC SQL DISCONNECT 'DB01' END-EXEC.
000940*
000950      EXIT PROGRAM.
000960*
000970 NOT-FOUND-ERROR.
000980 STM-ERROR.
000990      DISPLAY  "SQLSTATE :"  SQLSTATE.
001000      DISPLAY  "SQLMSG :  "  SQLMSG. 
001010*
001020      EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
001030      EXEC SQL COMMIT WORK END-EXEC.
001040      EXEC SQL DISCONNECT 'DB01' END-EXEC.
001050*
001060      EXIT PROGRAM.
001070*
001080 CONNECT-ERROR.
001090      DISPLAY  "SQLSTATE :"  SQLSTATE.
001100      DISPLAY  "SQLMSG :  "  SQLMSG. 
001110      EXIT PROGRAM.