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

5.2.4 ファンクションルーチンからの異常通知

ここでは、ファンクションルーチンからの異常通知について説明します。

Cプログラムの処理において、入力データの内容が異常だったときなど、ファンクションルーチンの実行結果をエラーにしたい場合があります。このような場合、SQLSignalMSG関数を使用することで、利用者定義の例外をSymfoware/RDBに送信し、ファンクションルーチンを呼び出したSQL文をエラーにすることができます。


[記述形式]

void SQLSignalMSG(char *msg_p)

msg_p:例外メッセージ格納先アドレス


検出した事象を設定したSQLSignalMSG関数を実行後、プログラムからSymfoware/RDBに復帰すると、SQL文の実行結果はエラーとなり、以下のメッセージが通知されます。通知される例外メッセージの長さは256バイトまでです。それ以上は切り捨てとなります。

JYP4557E
ファンクションルーチン“@1@”から例外が送信されました.例外メッセージ=“@2@”
[状態コード]
  60000
[メッセージの意味]
  ファンクションルーチン実行中に例外が発生しました。
[パラメタの意味]
  @1@:  Cプログラムの関数シンボル名
  @2@:  例外メッセージ

SQLSignalMSG関数を使用する場合、以下のファイルをインクルードします。また、ライブラリ作成時に以下のライブラリをリンクする必要があります。

Solarisインクルードするファイル … /opt/FSUNrdb2b/include/sqlsigm.h

リンクするライブラリ … /opt/FSUNrdb2b/lib/libsqlsigm.so

Linuxインクルードするファイル … /opt/FJSVrdb2b/include/sqlsigm.h

リンクするライブラリ … /opt/FJSVrdb2b/lib/libsqlsigm.so

Windowsインクルードするファイル … sqlsigm.h

インクルードするファイルは、<サーバ機能のインストール先>\ESQL\INCLUDEまたは<クライアント機能のインストール先>\ESQL\INCLUDEに格納されています。

リンクするライブラリ

リンクするライブラリは、<サーバ機能のインストール先>\ESQL\LIBまたは<クライアント機能のインストール先>\ESQL\LIBに格納されています。

詳細は、“5.2.2.2 ライブラリとして登録するCプログラムのコンパイル・リンク”を参照してください。

ファンクションルーチンから異常通知する場合のプログラミング例および出力されるエラーメッセージの例を以下に示します。ファンクションルーチンはUSERFUNC002、Cプログラムの関数シンボル名はUserFunc002であるとします。

ファンクションルーチンから異常通知する場合のプログラミング例

/*-------------------------------------------------------------*/
/* ファンクションルーチン"USERFUNC002"のCプログラム            */
/*-------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include "sqlsigm.h"  /* SQLSignalMSG関数宣言 */

/* 引数データのポインタリスト */
typedef struct in_ptr_list_tag {
   void  *ptr[2];    /* ファンクションのパラメタの個数×2 */
} in_ptr_list_t;

/* 結果データのポインタリスト */
typedef struct out_ptr_list_tag {
   void  *ptr[2];    /* 返却データと標識データの格納先 */
} out_ptr_list_t;

extern void UserFunc002(in_ptr_list_t  *in_p,
                        out_ptr_list_t *out_p)
{
    char    *ret_data_p;
    int     *c1_data_p;
    short   *c1_ind_p, *ret_ind_p;
    char    ret[41];
    int     data1;
    short   ind1, ret_size;

    /* 入力情報 */
    c1_data_p = (int   *)in_p->ptr[0];    /* 引数1のデータ     */
    c1_ind_p  = (short *)in_p->ptr[1];    /* 引数1の標識データ */
    /* 出力情報 */
    ret_data_p = (char *)out_p->ptr[0];   /* 結果のデータ       */
    ret_ind_p  = (short *)out_p->ptr[1];  /* 結果の標識データ   */

    /* 入力データを自動変数に取り出す */
    data1 = *c1_data_p;
    ind1  = *c1_ind_p;

    if (data1 < 0) {
        SQLSignalMSG("引数1が負の値です");
        return;
    }

    /* 結果データの作成 */
    sprintf(ret, "TEST-CODE=%ld", data1);
    ret_size = strlen(ret);
    /* 指定された結果データの格納先に結果データを書き込む */
    memcpy(ret_data_p, &ret_size, sizeof(short));
    memcpy((ret_data_p + sizeof(short)), ret, ret_size);
    *ret_ind_p = 0;
    return;
}

出力されるエラーメッセージの例

SELECT SCM1.USERFUNC002(CODE) FROM SCM1.CUSTOMER WHERE AGE > 40;

<SQL文の実行結果>
 SQLSTATE = 60000
 SQLMSG   = JYP4557Eファンクションルーチン"UserFunc002"から例外が送信されました.例外メッセージ="引数1が負の値です"