機能
コールバック関数を動的に登録します。このコールバック関数は、利用者が作成します。
記述形式
SQLRETURN SQLDynSetCallback ( SQLHDBS ses_id )
一般規則
SQLRETURNは、2バイトの整数型です。
マルチスレッドで動作するアプリケーションの場合は、ses_idにはセションIDが設定されます。シングルスレッドで動作するアプリケーションの場合は、0が設定されます。
SQLDynSetCallback関数は、以下のタイミングでロードされ実行されます。
マルチスレッドで動作するアプリケーションの場合は、SQLThrAllocID関数の処理でコールされます。
シングルスレッドで動作するアプリケーションの場合は、プロセス内で最初に実行されたSQL文の処理でコールされます。
SQLDynSetCallback関数の内部では、SQLSetCallback関数、SQLGetCallback関数以外のSQL拡張インタフェースおよび埋込みSQL文は実行できません。
正常復帰する場合は、SQLRDB_NORMALを返してください。異常終了する場合は、SQLRDB_NORMAL以外を返してください。
マルチスレッドで動作するアプリケーションの場合は、SQLThrAllocID関数でエラー復帰します。
シングルスレッドで動作するアプリケーションの場合は、SQLDynSetCallback関数がコールされたSQL文の実行結果として、SQLSTATEに74600を設定します。またホスト変数SQLMSGが定義されている場合は、返却された値を詳細種別に埋め込んだ以下のエラーメッセージを出力します。
JYP1085E:コールバック関数の登録処理でエラーが発生しました.詳細種別=“@1@”
sqlrdbei.hを組み込む必要があります。
異常時の対処
復帰コード | 意味 | 対処 |
---|---|---|
SQLRDB_NORMAL | 正常終了 | - |
SQLRDB_NORMAL以外の任意の値 | 異常終了 | コールバック関数の登録に失敗しました。 |
使用例
INSERT文、UPDATE文、DELETE文および単一行SELECT文に対するコールバック関数を実行時に登録します。
登録用DLLのプログラム
#include <stdio.h> #include "sqlrdbei.h" /* コールバック関数の動的登録関数定義 */ /* コールバック関数のプロトタイプ */ /* INSERT文用 */ SQLRETURN CFInsert( SQLHDBS, char *, char *, void *, SQLCALL_T * ); /* UPDATE文用 */ SQLRETURN CFUpdate( SQLHDBS, char *, char *, void *, SQLCALL_T * ); /* DELETE文用 */ SQLRETURN CFDelete( SQLHDBS, char *, char *, void *, SQLCALL_T * ); /* 単一行SELECT文用 */ SQLRETURN CFSelect( SQLHDBS, char *, char *, void *, SQLCALL_T * ); SQLRETURN SQLDynSetCallback( SQLHDBS sid ) { SQLRETURN ret; short kind_list[2]; /* INSERT文の入口コールバック関数 */ kind_list[0] = SQLRDB_CF_INSERT; kind_list[1] = 0; ret = SQLSetCallback( sid, CFInsert, NULL, kind_list, SQLRDB_CALL_IN ); if ( ret != SQLRDB_NORMAL ) { return( ret ); } /* UPDATE文の入口コールバック関数 */ kind_list[0] = SQLRDB_CF_UPDATE_SEARCH; kind_list[1] = 0; ret = SQLSetCallback( sid, CFUpdate, NULL, kind_list, SQLRDB_CALL_IN ); if ( ret != SQLRDB_NORMAL ) { return( ret ); } /* DELETE文の入口コールバック関数 */ kind_list[0] = SQLRDB_CF_DELETE_SEARCH; kind_list[1] = 0; ret = SQLSetCallback( sid, CFDelete, NULL, kind_list, SQLRDB_CALL_IN ); if ( ret != SQLRDB_NORMAL ) { return( ret ); } /* 単一行SELECT文の入口コールバック関数 */ kind_list[0] = SQLRDB_CF_SELECT; kind_list[1] = 0; ret = SQLSetCallback( sid, CFSelect, NULL, kind_list, SQLRDB_CALL_IN ); if ( ret != SQLRDB_NORMAL ) { return( ret ); } return( SQLRDB_NORMAL ); } SQLRETURN CFInsert( SQLHDBS sid, char *sqlstate, char *sqlmsg, void *area, SQLCALL_T *sql_dat) { SQLDATA_T param; short roop; char sqlstr[1024]; printf( "ファイル名 : %s\n", sql_dat->application ); printf( "SQL文 : %s\n", sql_dat->sql_stmt ); return ( SQLRDB_CONTINUE ); } SQLRETURN CFUpdate( SQLHDBS sid, char *sqlstate, char *sqlmsg, void *area, SQLCALL_T *sql_dat) { SQLDATA_T param; short roop; char sqlstr[1024]; printf( "ファイル名 : %s\n", sql_dat->application ); printf( "SQL文 : %s\n", sql_dat->sql_stmt ); return ( SQLRDB_CONTINUE ); } SQLRETURN CFDelete( SQLHDBS sid, char *sqlstate, char *sqlmsg, void *area, SQLCALL_T *sql_dat) { SQLDATA_T param; short roop; char sqlstr[1024]; printf( "ファイル名 : %s\n", sql_dat->application ); printf( "SQL文 : %s\n", sql_dat->sql_stmt ); return ( SQLRDB_CONTINUE ); } SQLRETURN CFSelect( SQLHDBS sid, char *sqlstate, char *sqlmsg, void *area, SQLCALL_T *sql_dat) { SQLDATA_T param; short roop; char sqlstr[1024]; printf( "ファイル名 : %s\n", sql_dat->application ); printf( "SQL文 : %s\n", sql_dat->sql_stmt ); return ( SQLRDB_CONTINUE ); }