Hitachi

ノンストップデータベース HiRDB Version 10 構造型データベース機能(UAP開発編)


2.11.2 コーディング例

COBOLソースプログラムのコーディング例を次に示します。

左端の番号は行番号を示しています。

1       IDENTIFICATION DIVISION.
2       PROGRAM-ID. UAPDML01.
3      *
4       ENVIRONMENT DIVISION.
5      *
6       INPUT-OUTPUT SECTION.
7      *
8       DATA DIVISION.
9      *
10       SDB-DATABASE SECTION.                     -
11         SDB                  DATABASE01          |
12         RECORD NAME          RECNAME             | 1.
13         RECORD LENGTH        RECLENG             |
14         .                                       -
15      *
16       WORKING-STORAGE SECTION.
17      *
18       77  EOF                 PIC X VALUE '0'.
19       77  ERR-FLG             PIC X VALUE '0'.
20       77  TENPO_END           PIC X VALUE '0'.
21       77  ZAIKO_END           PIC X VALUE '0'.
22       77  TENPO_NOT_1ST       PIC X VALUE '0'.
23      *
24       77  RECNAME            PIC X(30) VALUE SPACE.         ←2.
25       77  RECLENG            PIC S9(8) COMP-5 VALUE ZERO.   ←2.
26      *
27       01  OUTREC  IS  GLOBAL PIC X(132).
28      *
29       01  INREC   IS  GLOBAL PIC X(80).
30       01  INREC_W            REDEFINES INREC.
31         02  IW_SYORI         PIC X.
32         02  FILLER           PIC X.
33         02  IW_KUBUN         PIC X.
34         02  FILLER           PIC X(77).
35      *
36       01  INREC_R            REDEFINES INREC_W.
37         02  IR_SYORI         PIC X.
38         02  FILLER           PIC X.
39         02  IR_KUBUN         PIC X.
40         02  FILLER           PIC X.
41         02  IR_KSN-KUBUN     PIC X.
42         02  FILLER           PIC X.
43         02  IR_TENPO_CD      PIC X.
44         02  FILLER           PIC X.
45         02  IR_TENPO_NAME    PIC X(30).
46       01  INREC_C            REDEFINES INREC_W.
47         02  IC_SYORI         PIC X.
48         02  FILLER           PIC X.
49         02  IC_KUBUN         PIC X.
50         02  FILLER           PIC X.
51         02  IC_KSN-KUBUN     PIC X.
52         02  FILLER           PIC X.
53         02  IC_IO-KUBUN      PIC X.
54         02  FILLER           PIC X.
55         02  IC_TENPOID       PIC X.
56         02  FILLER           PIC X.
57         02  IC_SCODE         PIC X(4).
58         02  FILLER           PIC X.
59         02  IC_SNAME         PIC X(30).
60         02  FILLER           PIC X.
61         02  IC_SCOLOR        PIC X(10).
62         02  FILLER           PIC X.
63         02  IC_STANKA        PIC 9(10).
64         02  FILLER           PIC X.
65         02  IC_SSURYO        PIC 9(10).
66      *
67       01  TENPO.                                  -
68         02  RT_DBKEY.                              | 3.
69           03  TENPO_CD       PIC X.                |
70         02  TENPO_NAME       PIC X(30).           -
71      *
72       01  ZAIKO.                                  -
73         02  CH_TENPO_CD      PIC X.                |
74         02  CH_DBKEY         PIC S9(8) COMP-5.     |
75         02  SCODE            PIC X(4).             | 4.
76         02  SNAME            PIC X(30).            |
77         02  SCOLOR           PIC X(10).            |
78         02  TANKA            PIC S9(8) COMP-5.     |
79         02  ZSURYO           PIC S9(8) COMP-5.    -
80      *
81       01  MIDASHI.
82         02  FILLER           PIC X(80) VALUE 
83                              '***   ZAIKO ICHIRAN   ***'.
84      *
85       01  O_TENPO.
86         02  FILLER           PIC X(15) VALUE '  TENPO CODE : '.
87         02  O_TENPO_CD       PIC X.
88         02  FILLER           PIC X(10) VALUE ', NAME : "'.
89         02  O_TENPO_NAME     PIC X(30).
90         02  FILLER           PIC X     VALUE '"'.
91      *
92       01  O_ZAIKO.
93         02  FILLER           PIC X(15) VALUE '  ZAIKO CODE : '.
94         02  O_ZAIKO_CODE     PIC X(4).
95         02  FILLER           PIC X(10) VALUE ', NAME : "'.
96         02  O_ZAIKO_NAME     PIC X(30).
97         02  FILLER           PIC X(11) VALUE '", COLOR : '.
98         02  O_ZAIKO_COLOR    PIC X(10).
99         02  FILLER           PIC X(10) VALUE ', TANKA : '.
100         02  O_ZAIKO_TANKA    PIC ZZZZZZZZ9.
101         02  FILLER           PIC X(11) VALUE ', SUURYO : '.
102         02  O_ZAIKO_SUURYO   PIC ZZZZZZZZ9.
103      *
104       01  ERR_MSG.
105         02  FILLER           PIC X(22) VALUE '***   ERROR SQLCODE : '.
106         02  EM_SQLCODE       PIC -ZZZZZZZZ9.
107         02  FILLER           PIC X(15) VALUE ', ERROR DML : "'.
108         02  EM_ERRDML        PIC X(30).
109         02  FILLER           PIC X(7) VALUE '"   ***'.
110      *
111       LINKAGE SECTION.
112      *
113       77 IN_DATA             PIC X(80).                 ←5.
114       77 IN_LENG             PIC S9(9) COMP-5.          ←6.
115       77 OUT_DATA            PIC X(32).                 ←7.
116       77 OUT_LENG            PIC S9(9) COMP-5.          ←8.
117      *
118       PROCEDURE DIVISION USING IN_DATA IN_LENG OUT_DATA OUT_LENG.
119       MAIN SECTION.
120      * test
121       MOVE IN_DATA TO INREC.
122      *
123       M-01.
124           MOVE 0 TO RETURN-CODE.
125           MOVE 'SVR01: NORMAL END' TO OUT_DATA          ←9.
126           MOVE 32 TO OUT_LENG                           ←9.
127           DISPLAY 'UAPDML01 START'.
128           DISPLAY 'IW_SYORI =' IW_SYORI.
129           DISPLAY 'IW_KUBUN =' IW_KUBUN.
130      *
131       M-02.
132           IF IW_SYORI = 'D'
133           THEN
134             PERFORM DB-KOUSHIN
135           ELSE IF IW_SYORI = 'F'
136             PERFORM FUTSUU
137           END-IF.
138      *
139           IF OUT_DATA NOT = 'SVR01: NORMAL END'
140           THEN
141             PERFORM IJYOU
142           END-IF.
143       M-EXIT.
144           EXIT PROGRAM.
145      *
146       DB-KOUSHIN SECTION.
147       D-01.
148      *    MOVE INREC TO INREC_W
149           IF IW_KUBUN = 'R'
150           THEN
151             EVALUATE IR_KSN-KUBUN
152               WHEN 'S'
153                 PERFORM TENPO-TSUIKA
154               WHEN 'E'
155                 PERFORM TENPO-SAKUJO
156             END-EVALUATE
157           ELSE
158             MOVE IC_TENPOID TO TENPO_CD
159             MOVE 'D-01:FIND TENPO' TO EM_ERRDML
160             EXEC DML                                             -
161               FIND FIRST "TENPO" WHERE ( "DBKEY" = :RT_DBKEY )    | 10.
162             END-DML                                              -
163             IF SQLCODE = 0                                        ←11.
164               EVALUATE IC_KSN-KUBUN
165                 WHEN 'M'
166                   PERFORM ZAIKO-KOUSHIN
167                 WHEN 'S'
168                   PERFORM ZAIKO-TSUIKA
169                 WHEN 'E'
170                   PERFORM ZAIKO-SAKUJO
171               END-EVALUATE
172             ELSE
173               MOVE '2' TO ERR-FLG
174               MOVE 'SVR01: DB-KOUSHIN FAILED' TO OUT_DATA         ←12.
175               MOVE 24 TO OUT_LENG
176             END-IF
177           END-IF.
178       D-EXIT.
179           EXIT.
180      *
181       ZAIKO-KOUSHIN SECTION.
182       M-01.
183           PERFORM ICHIDUKE.            ←13.
184           IF ERR-FLG = '0'
185           THEN
186             IF IC_IO-KUBUN = '1'
187             THEN
188               COMPUTE ZSURYO = ZSURYO + IC_SSURYO     ←14.
189             ELSE
190               COMPUTE ZSURYO = ZSURYO - IC_SSURYO     ←14.
191             END-IF
192             MOVE 'M-01:MODIFY ZAIKO' TO EM_ERRDML
193             EXEC DML
194               MODIFY ZAIKO FROM :ZAIKO       ←15.
195             END-DML
196             IF SQLCODE NOT = 0               ←11.
197             THEN
198               MOVE '2' TO ERR-FLG
199               MOVE 'SVR01: ZAIKO-KOUSHIN FAILED' TO OUT_DATA     ←16.
200               MOVE 27 TO OUT_LENG
201             ELSE
202               CONTINUE
203             END-IF
204           END-IF.
205       M-EXIT.
206           EXIT.
207      *
208       ZAIKO-TSUIKA SECTION.
209       S-01.
210           MOVE IC_TENPOID TO TENPO_CD.       ←17.
211           MOVE 0          TO CH_DBKEY.       ←18.
212           MOVE IC_SCODE   TO SCODE.          -
213           MOVE IC_SNAME   TO SNAME.           |
214           MOVE IC_SCOLOR  TO SCOLOR.          |17.
215           MOVE IC_STANKA  TO TANKA.           |
216           MOVE IC_SSURYO  TO ZSURYO.         -
217       S-02.
218           MOVE 'S-02:STORE ZAIKO' TO EM_ERRDML.
219           EXEC DML
220             STORE ZAIKO FROM :ZAIKO          ←19.
221           END-DML.
222           IF SQLCODE NOT = 0                 ←11.
223           THEN
224             MOVE '2' TO ERR-FLG
225             MOVE 'SVR01: ZAIKO-TSUIKA FAILED' TO OUT_DATA     ←12.
226             MOVE 26 TO OUT_LENG
227           ELSE
228             CONTINUE
229           END-IF.
230       S-EXIT.
231           EXIT.
232      *
233       ZAIKO-SAKUJO SECTION.
234       E-01.
235           PERFORM ICHIDUKE.                  ←20.
236           IF ERR-FLG = '0'
237           THEN
238             MOVE 'E-01:ERASE ZAIKO' TO EM_ERRDML
239             EXEC DML
240               ERASE ZAIKO ALL                ←21.
241             END-DML
242             IF SQLCODE NOT = 0               ←11.
243             THEN
244               MOVE '2' TO ERR-FLG
245               MOVE 'SVR01: ZAIKO-SAKUJO FAILED' TO OUT_DATA      ←12.
246               MOVE 26 TO OUT_LENG
247             ELSE
248               CONTINUE
249             END-IF
250           END-IF.
251       E-EXIT.
252           EXIT.
253      *
254       TENPO-TSUIKA SECTION.
255       A-01.
256           MOVE IR_TENPO_CD   TO TENPO_CD.           ←22.
257           MOVE IR_TENPO_NAME TO TENPO_NAME.         ←17.
258           MOVE 'A-01:STORE TENPO' TO EM_ERRDML
259           DISPLAY TENPO.
260           EXEC DML
261             STORE TENPO FROM :TENPO                 ←23.
262           END-DML.
263           IF SQLCODE NOT = 0                        ←11.
264           THEN
265             MOVE '2' TO ERR-FLG
266             MOVE 'SVR01: TENPO-TSUIKA FAILED' TO OUT_DATA      ←12.
267             MOVE 26 TO OUT_LENG
268           ELSE
269             CONTINUE
270           END-IF.
271       A-EXIT.
272           EXIT.
273      *
274       TENPO-SAKUJO SECTION.
275       K-01.
276           MOVE IR_TENPO_CD   TO TENPO_CD.           ←24.
277           MOVE 'K-01:FIND TENPO' TO EM_ERRDML
278           EXEC DML
279             FIND FOR UPDATE FIRST TENPO             ←25.
280               WHERE ( "DBKEY" = :RT_DBKEY )         ←25.
281           END-DML.
282           IF SQLCODE = 0                            ←11.
283           THEN
284             MOVE 'K-01:ERASE TENPO' TO EM_ERRDML
285             EXEC DML
286               ERASE TENPO ALL                       ←26.
287             END-DML
288           ELSE
289             CONTINUE
290           END-IF.
291           IF SQLCODE NOT = 0                        ←11.
292           THEN  
293             MOVE '2' TO ERR-FLG
294             MOVE 'SVR01: TENPO-SAKUJO FAILED' TO OUT_DATA      ←12.
295             MOVE 26 TO OUT_LENG
296           ELSE
297             CONTINUE
298           END-IF.
299       K-EXIT.
300           EXIT.
301      *
302       ICHIDUKE SECTION.
303       I-01.
304           MOVE 'I-01:FETCH ZAIKO 01' TO EM_ERRDML.
305           EXEC DML
306             FETCH FOR UPDATE FIRST ZAIKO            ←27.
307               INTO :ZAIKO WITHIN TENPO_ZAIKO
308           END-DML.
309           IF SQLCODE NOT = 0                        ←11.
310           THEN
311             MOVE '2' TO ERR-FLG
312             MOVE 'SVR01: ICHIDUKE FAILED' TO OUT_DATA       ←12.
313             MOVE 22 TO OUT_LENG
314           ELSE
315             CONTINUE
316           END-IF.
317           PERFORM UNTIL ( IC_SCODE = SCODE OR ERR-FLG NOT = '0' )
318             MOVE 'I-01:FETCH ZAIKO 02' TO EM_ERRDML
319             EXEC DML
320               FETCH FOR UPDATE NEXT ZAIKO           ←28.
321                 INTO :ZAIKO WITHIN TENPO_ZAIKO
322             END-DML
323             IF SQLCODE NOT = 0                      ←11.
324             THEN
325               MOVE '2' TO ERR-FLG
326               MOVE 'SVR01: ICHIDUKE FAILED' TO OUT_DATA      ←12.
327               MOVE 22 TO OUT_LENG
328             ELSE
329               CONTINUE
330             END-IF
331           END-PERFORM.
332       I-EXIT.
333           EXIT.
334      * 
335       FUTSUU SECTION.
336       F-01.
337           MOVE  MIDASHI  TO  OUTREC.
338           DISPLAY OUTREC UPON SYSOUT.
339           PERFORM UNTIL ( TENPO_END = '1' OR ERR-FLG NOT = '0'  )
340             MOVE 'F-01:FETCH TENPO' TO EM_ERRDML
341             IF TENPO_NOT_1ST = '0'
342             THEN
343               EXEC DML
344                 FETCH FOR UPDATE FIRST TENPO INTO :TENPO      ←29.
345               END-DML
346             ELSE
347               EXEC DML
348                 FETCH FOR UPDATE NEXT TENPO INTO :TENPO       ←30.
349               END-DML
350             END-IF
351             IF SQLCODE = 0                                    ←11.
352             THEN
353               MOVE TENPO_CD   TO O_TENPO_CD
354               MOVE TENPO_NAME TO O_TENPO_NAME
355               MOVE O_TENPO    TO OUTREC
356               DISPLAY OUTREC UPON SYSOUT
357               PERFORM UNTIL ( ZAIKO_END = '1' OR ERR-FLG NOT = '0' )
358                 MOVE 'F-01:FETCH ZAIKO' TO EM_ERRDML
359                 EXEC DML
360                   FETCH NEXT ZAIKO INTO :ZAIKO WITHIN TENPO_ZAIKO      ←31.
361                 END-DML
362                 IF SQLCODE = 0                                  ←11.
363                 THEN
364                   MOVE SCODE  TO O_ZAIKO_CODE                  -
365                   MOVE SNAME  TO O_ZAIKO_NAME                   |
366                   MOVE SCOLOR  TO O_ZAIKO_COLOR                 | 32.
367                   MOVE TANKA  TO O_ZAIKO_TANKA                  |
368                   MOVE ZSURYO TO O_ZAIKO_SUURYO                 |
369                   MOVE  O_ZAIKO  TO  OUTREC                    -
370                   DISPLAY OUTREC UPON SYSOUT
371                 ELSE 
372                   IF SQLCODE = 100                             -
373                   THEN                                          | 33.
374                     MOVE '1' TO ZAIKO_END                      -
375                   ELSE
376                     MOVE '2' TO ERR-FLG
377                     MOVE 'SVR01: FUTSUU FAILED' TO OUT_DATA     ←12.
378                     MOVE 20 TO OUT_LENG
379                   END-IF
380                 END-IF
381               END-PERFORM
382               MOVE '1' TO TENPO_NOT_1ST
383               MOVE '0' TO ZAIKO_END
384             ELSE
385               IF SQLCODE = 100                                 -
386               THEN                                              | 34.
387                 MOVE '1' TO TENPO_END                          -
388               ELSE
389                 MOVE '2' TO ERR-FLG
390                 MOVE 'SVR01: FUTSUU FAILED' TO OUT_DATA         ←12.
391                 MOVE 20 TO OUT_LENG
392               END-IF
393             END-IF
394           END-PERFORM.
395       F-EXIT.
396           EXIT.
397      *
398       IJYOU SECTION.
399       J-01.
400           MOVE  SQLCODE TO EM_SQLCODE.                        ←35.
401           MOVE  ERR_MSG  TO  OUTREC.
402           DISPLAY OUTREC UPON SYSOUT.                         ←36.
403           DISPLAY SQLERRMC(1:SQLERRML) UPON SYSOUT.           ←37.
404           MOVE  INREC  TO  OUTREC.
405           DISPLAY OUTREC UPON SYSOUT.                         ←38.
406           MOVE  OUT_DATA  TO  OUTREC.
407           DISPLAY OUTREC UPON SYSOUT.                         ←39.
408       J-EXIT.
409           EXIT.

[説明]

  1. SDBデータベース節を指定します。

    • UAP内のDMLでアクセスするSDBデータベースを指定します。

    • DMLの実行後にレコード名を受け取る埋込み変数の名前を指定します。

    • DMLの実行後にレコード長を受け取る埋込み変数の名前を指定します。

    SDBデータベース節については,「2.3 SDBデータベース節の記述」を参照してください。

  2. 次の埋込み変数を宣言します。

    • SDBデータベース節のRECORD NAMEで指定した埋込み変数を宣言します。

    • SDBデータベース節のRECORD LENGTHで指定した埋込み変数を宣言します。

  3. レコード型TENPOとデータの受け渡しを行う埋込み変数を宣言します。

    埋込み変数の宣言については,「2.4 埋込み変数の宣言」を参照してください。

  4. レコード型ZAIKOとデータの受け渡しを行う埋込み変数を宣言します。

  5. クライアントUAPから値が渡されるデータ領域:入力パラメタ

  6. クライアントUAPから値が渡されるデータ領域:入力パラメタ長

  7. UAPで値を設定するデータ領域:サービスプログラムの応答

  8. UAPで値を設定するデータ領域:サービスプログラムの応答の長さ

  9. SUPに返すメッセージを正常時の値で初期設定します。

  10. ルートレコードのデータベースキーの一致するTENPOレコードに位置指示子を位置づけます。

    DML先頭子(EXEC DML)に続けてDMLを記述します。DMLの直後にDML終了子(END-DML)を記述します。

  11. SQLCODEを参照してDMLの実行結果を判定します。

    DMLの実行結果の判定については,「2.7 DMLの実行結果の判定処理」を参照してください。

  12. SUPに返すメッセージにエラーを示す値を設定します。

  13. レコード実現値の変更前に,変更するレコードに対して位置指示子を位置づけます。

  14. 変更する構成要素に対応する埋込み変数に更新値を設定します。

  15. 位置づけしたZAIKOレコードのユーザデータを埋込み変数の値に変更します。

  16. SUP側でチェックするメッセージです。

  17. 構成要素に対応する埋込み変数に格納するデータを設定します。

  18. 一連番号はHiRDB/SDが割り当てます。

  19. 親レコードTENPOへの位置づけ後に,子レコードZAIKOを格納します。

  20. レコードの削除をする前に,削除するレコードに位置指示子を位置づけます。

  21. 位置づけしたZAIKOレコードを削除します。

  22. TENPOレコードはルートレコードのため,格納前にルートレコードのデータベースキーの値を埋込み変数に設定します。

  23. ルートレコードのTENPOレコードを格納します。

  24. キーの検索条件に指定する埋込み変数に,削除対象のルートレコードのデータベースキーの値を設定します。

  25. レコード実現値の削除前に,削除するレコードに対して位置指示子を更新指定で位置づけます。削除するレコードはキーの検索条件で指定します。

  26. 位置指示子が位置づけられているレコードを削除します。下位レコードがある場合は,下位レコードも同時に削除されます。

  27. 子レコードZAIKOの検索は,親レコードTENPOの位置づけ後に行います。更新指定で先頭のZAIKOレコードへの位置づけを行い,レコード実現値を埋込み変数ZAIKOに取得します。

  28. 現在位置づけられているZAIKOレコードの次のレコードに更新指定で位置づけを行い,レコード実現値を埋込み変数ZAIKOに取得します。

  29. 先頭のTENPOレコードへの位置づけを行い,レコード実現値を埋込み変数TENPOに取得します。

  30. 現在位置づけられているTENPOレコードの次のレコードに位置づけを行い,レコード実現値を埋込み変数TENPOに取得します。

  31. ZAIKOレコードに位置づけがない場合は,先頭のZAIKOレコードに位置づけを行い,レコード実現値を埋込み変数ZAIKOに取得します。

    位置づけられている場合,位置づけられているZAIKOレコードの次のレコードに位置づけを行い,レコード実現値を埋込み変数ZAIKOに取得します。

  32. 埋込み変数からレコード実現値を取り出します。

  33. SQLCODEが100かどうかを判定します。100の場合は,TENPOレコード下のすべてのZAIKOレコードの検索が完了しています。

  34. SQLCODEが100かどうかを判定します。100の場合は,すべてのTENPOレコードの検索が完了しています。

  35. エラー要因を取得するため,SQLCODEをエラーメッセージに含めます。

  36. エラーメッセージを出力します。

  37. HiRDBのエラーメッセージを出力します。

  38. エラーが発生した入力データを出力します。

  39. エラーが発生した手続きを出力します。