• 検索結果がありません。

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

ドキュメント内 アプリケーション開発ガイド (埋込みSQL編) (ページ 156-159)

第4章 ルーチンを利用するアプリケーションの作成

4.2 ファンクションルーチンを利用する場合

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

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

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

インクルードするファイル… /opt/FSUNrdb2b/include/sqlsigm.h リンクするライブラリ … /opt/FSUNrdb2b/lib/libsqlsigm.so インクルードするファイル… /opt/FJSVrdb2b/include/sqlsigm.h リンクするライブラリ … /opt/FJSVrdb2b/lib/libsqlsigm.so インクルードするファイル … sqlsigm.h

インクルードするファイルは、<サーバ機能のインストール先>¥ESQL¥INCLUDEまたは<クライアント機能のインストール先

>¥ESQL¥INCLUDEに格納されています。

リンクするライブラリ

Itanium版64ビットEEまたはItanium版64ビットSEの場合 リンクするライブラリ … f3cwsqlsigm_ia64.lib

x64版64ビットEEまたはx64版64ビットSEの場合

リンクするライブラリ …f3cwsqlsigm_x64.lib

上記以外の場合

リンクするライブラリ… f3cwsqlsigm.lib

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

詳細は、“4.2.4.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が負の値です"

ドキュメント内 アプリケーション開発ガイド (埋込みSQL編) (ページ 156-159)