Symfoware Parallel Server RDBユーザーズガイド 応用プログラム開発編
目次 索引 前ページ次ページ

第2章 データベースを処理する応用プログラムの開発の概要> 2.2 SQL埋込みCOBOLプログラムの作成方法

2.2.4 SQL文の処理結果の確認

応用プログラムはSQL文を実行したあと、実行結果を確認して処理を進めて行くことが必要です。このSQL文の実行結果を確認する方法には、以下の2とおりがあります。

  1. 状態変数の内容をチェックします。状態変数の変数名は“SQLSTATE”です。

  2. 埋込み例外宣言(WHENEVER文)によって、SQL文の処理にエラーがあった場合、または、検索データが見つからなかった場合の処理を指定しておきます。

a)の方法は、SQLSTATEに通知される実行結果を判定しながら処理を進める方法です。各SQL文の実行ごとに、実行結果をSQLSTATEに通知します。SQLSTATEに通知される値とその意味は、“SQLSTATE値”に示します。

b)の方法は、あらかじめある条件(エラーまたは検索データが見つからない)とその条件が発生したときの処理を指定しておく方法です。これによって、SQL文の実行ごとにチェックしなくても済みます。本項では、WHENEVER文の指定方法を説明します。

■埋込み例外宣(WHENEVER)の指定方法

埋込み例外宣言は、SQL文が例外条件を生じた場合に実行する処理を指定するSQL文です。埋込み例外宣言の指定例を以下に示します。

例1

データなし以外のエラーが発生した場合には、ERR001へ進むことを指定します。
  EXEC SQL  WHENEVER   SQLERROR   GOTO   :ERR001  END-EXEC       
                          (1)          (2)

(1) 条件

(2) 例外動作

例2

検索の結果データが見つからない場合に、処理をそのまま続行することを指定します。
  EXEC SQL  WHENEVER  NOT  FOUND   CONTINUE  END-EXEC            
                          (1)         (2)

(1) 条件

(2) 例外動作

条件は、以下の2とおりの指定ができます。

NOT FOUND:
検索データが見つからない場合に指定の例外動作を行います。
SQLERROR:
“検索データが見つからない”以外のエラーが発生した場合に指定の例外動作を行います。

例外動作は、以下の2とおりの指定ができます。

CONTINUE:
次のステートメントに進みます。
GOTO <行き先>:
行き先で指定のステートメントに進みます。ここで、<行き先>は、制御を移す先の節名(セクション名)または段落名(パラグラフ名)の前にコロン“:”を付けて指定します。

例3

SQL埋込みCOBOLプログラムで、SQL文にエラーが発生した場合には、P-ERRORへ進み、変数RCODEに8を設定することを指定します。
  EXEC SQL  WHENEVER SQLERROR  GOTO  :P-ERROR  END-EXEC                   
        …                                                                
  P-ERROR.                                                                
      MOVE 8 TO RCODE.                                                    

WHENEVERは複数個宣言することができます。条件の同じWHENEVER文を指定した場合、応用プログラム中での記述順序であとの宣言が有効になります。実行の順序とは関係ありません。

図:WHENEVER文を使用した応用プログラムの例に、WHENEVER文の有効範囲の例を示します。

[図:WHENEVER文を使用した応用プログラムの例]

    IDENTIFICATION DIVISION.                                          
        …                                                            
    PROCEDURE DIVISION.                                               
        EXEC SQL DECLARE CU1 CURSOR FOR  SELECT 製品名,在庫数量       
                   FROM S1.在庫表  WHERE 製品番号 = :PNO  END-EXEC.   
        EXEC SQL DECLARE CU2 CURSOR FOR  SELECT 発注数量              
                   FROM S1.発注表  WHERE 取引製品=:PNO  END-EXEC.     
                                                                      
        EXEC SQL WHENEVER SQLERROR GOTO :P-ERROR  END-EXEC.           (1)
                                                                                  *
        EXEC SQL OPEN CU1 END-EXEC.                                               |
        EXEC SQL WHENEVER NOT FOUND GOTO :P-NEXT  END-EXEC.           (2)         |
        MOVE 0 TO TOTAL.                                                *        |
    P-LOOP1.                                                            |        |
        EXEC SQL FETCH CU1 INTO :PRODUCT, :QOH  END-EXEC.               |        |
        COMPUTE TOTAL = TOTAL + QOH.                                    |        |
        GO TO P-LOOP1.                                                  *(2)の有 |
    P-NEXT.                                                             |効範囲  |
        EXEC SQL CLOSE CU1  END-EXEC.                                   |        |
        DISPLAY PRODUCT NC"在庫数量=" TOTAL.                           |        |
                                                                        |        |
        EXEC SQL OPEN CU2  END-EXEC.                                    *        |
        EXEC SQL WHENEVER NOT FOUND GOTO :P-END   END-EXEC.           (3)         *(1)の有
        MOVE 0 TO TOTAL.                                                *        |効範囲
    P-LOOP2.                                                            |        |
        EXEC SQL FETCH CU2 INTO :QOO  END-EXEC.                         |        |
        COMPUTE TOTAL = TOTAL + QOO.                                    |        |
        GO TO P-LOOP2.                                                  |        |
    P-END.                                                              |        |
        EXEC SQL CLOSE CU2  END-EXEC.                                   *(3)の有 |
        DISPLAY PRODUCT NC"発注数量=" TOTAL.                           |効範囲  |
        STOP RUN.                                                       |        |
                                                                        |        |
    P-ERROR.                                                            |        |
        DISPLAY "SQLERROR SQLSTATE=" SQLSTATE.                          |        |
        DISPLAY "SQLMSG=" SQLMSG.                                       |        |
        STOP RUN.                                                       *        *

(1) SQL文の実行でNOT FOUND以外のエラーが生じた場合にP-ERRORへ進み、エラー情報を出力しプログラムは終了します。

(2) カーソル“CU1”の操作でNOT FOUND(検索データが見つからない)が生じた場合にP-NEXTへ進みカーソル“CU1”のクローズと在庫数量の出力を行います。

(3) カーソル“CU2”の操作でNOT FOUND(検索データが見つからない)が生じた場合にP-ENDへ進みカーソル“CU2”のクローズと発注数量の出力を行い、プログラムは終了します。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006