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

第3章 プロシジャを利用する応用プログラムの作成方法

3.5 プロシジャルーチンの処理結果

ここでは、プロシジャルーチン内での処理結果の確認方法と、プロシジャルーチンの呼出し元の応用プログラムでの処理結果の確認方法について説明します。

■プロシジャルーチン内での処理結果の確

プロシジャルーチン内の処理結果は、応用プログラムの場合と同様に、SQLSTATEとSQLMSGに通知されます。利用者は、SQLSTATEおよびSQLMSGをSQL変数として宣言しておき、その内容を参照することによって処理の切り分けを行うことができます。また、WHENEVER文により、SQL文の処理にエラーがあった場合または検索データが見つからなかった場合の処理を指定することができます。

ただし、SQLSTATE値の例外コードの先頭が4または7の場合、および例外コードが2Fの場合は、呼出し元の応用プログラムに無条件に復帰します。

■プロシジャルーチンの呼出し元での処理結果の確

プロシジャルーチンを呼び出した応用プログラムのSQLSTATEおよびSQLMSGには、以下の実行結果がプロシジャルーチンから通知されます。

これら以外のメッセージまたは実行結果を呼出し元に通知する場合は、プロシジャルーチンのパラメタ変数に設定して実行結果を通知します。

図:プロシジャルーチンの呼出し元での処理結果の確認および図:プロシジャルーチン内での処理結果の設定に、呼出し元とプロシジャルーチン内での処理結果の確認の具体例を示します。

[図:プロシジャルーチンの呼出し元での処理結果の確認]

  #include <stdio.h>                                                    
  EXEC SQL BEGIN DECLARE SECTION;                                       
  char BUF[256];                                                        
  char SQLSTATE[6];                      *                             
  char SQLMSG[256];                      *  (1)                         
  char PROCSTATE[6] ;                    |                              
  char PROCMSG[256] ;                    *                              
  EXEC SQL END DECLARE SECTION;                                          
                                                                         
  main()                                                                 
  {                                                                     
          memset( SQLMSG, 0xff, 256 );                                   
          memset( SQLSTATE, '0', 5 );                                    
          strcpy( BUF, "CALL スキーマ00.PCALL000(?,?)");               
                                                                         
          EXEC SQL WHENEVER SQLERROR GOTO :ERR_SQL;                      
            〜                                                           
                                                                         
          EXEC SQL PREPARE  識別子 FROM :BUF ;                           
          EXEC SQL EXECUTE  識別子 INTO :PROCSTATE,:PROCMSG ;             (2) 
            〜                                                                
                                                                              
          if(memcmp(PROCSTATE ,"00000",5) != 0) {                        (3) 
                  printf("PCALL000内で異常発生\n");                           
                  printf("    エラーコード     ===> %s\n", PROCSTATE);        
                  printf("    エラーメッセージ ===> %s\n", PROCMSG);          
                  goto  ERR_EXIT;                                             
          }                                                                  
            〜                                                                
                                                                              
          EXEC SQL COMMIT WORK ;                                              
          return(0);                                                          
                                                                              
  ERR_SQL:                                                                    
          printf("異常発生\n");                                         (4)   
          printf("    エラーコード     ===> %s\n", SQLSTATE);                 
          printf("    エラーメッセージ ===> %s\n", SQLMSG);                   
                                                                              
  ERR_EXIT:                                                                   
          EXEC SQL ROLLBACK ;                                                 
          return(1);                                                          
  }                                                                          

(1) SQLSTATE、SQLMSGおよびプロシジャルーチンのパラメタをホスト変数として宣言します。

(2) プロシジャルーチンPCAL000を呼び出します。

(3) プロシジャルーチンのパラメタPROCSTATEが“00000”以外の場合は、プロシジャルーチン内で異常が起きたとみなし、エラーコードとメッセージを表示して終了します。

(4) 応用プログラムでエラーが起きた場合の処理を行います。

[図:プロシジャルーチン内での処理結果の設定]

  EXEC SQL                                                                 
                                                                           
  CREATE PROCEDURE  スキーマ00.PCALL000( OUT PROCSTATE CHAR(5),          
                                           OUT PROCMSG CHAR(256) )    (1)  
    BEGIN                                                                  
          DECLARE SQLSTATE        CHAR(5) ;                           (2)  
          DECLARE SQLMSG          CHAR(256) ;                              
          DECLARE VDDEC           DEC(18,0)       DEFAULT 1 ;              
            〜                                                             
                                                                           
          DECLARE  CUR1 CURSOR FOR  SELECT  製品番号,   …                 
            〜                                                             
          WHENEVER SQLERROR GOTO  異常1;                             (3)  
            〜                                                             
          OPEN  CUR1;                                                      
            〜                                                             
          FETCH CUR1 INTO  …                                              
            〜                                                             
                                                                           
  異常1:                                                                  
          --  結果をプロシジャルーチンのパラメタに設定する.                
          SET PROCSTATE = SQLSTATE ;                                  (4)  
          SET PROCMSG = SQLMSG ;                                           
  END                                                                      
                                                                           
  END-EXEC;                                                                

(1) CREATE PROCEDURE文にパラメタを定義します。

(2) SQLSTATEとSQLMSGをSQL変数として宣言します。

(3) SQL文で異常が起きた場合は、異常1に進みます。

(4) 呼出し元の応用プログラムに通知するため、SQLSTATEおよびSQLMSGの内容を、プロシジャルーチンのパラメタに設定します。


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

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