機能
コールバック関数を動的に登録します。このコールバック関数は、利用者が作成します。
記述形式
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 );
}