機能
指定されたSQL文種別に対し、コールバック関数の登録状況を取得します。
記述形式
SQLRETURN SQLGetCallback ( SQLHDBS ses_id,
SQLRETURN (**function)( SQLHDBS,
char *,
char *,
void *,
struct SQLCALL_T * ),
short sql_kind,
short when )一般規則
SQLRETURNは、2バイトの整数型です。
マルチスレッドで動作するアプリケーションの場合は、ses_idにセションIDを指定します。シングルスレッドで動作するアプリケーションの場合は、ses_idに0を指定します。
現在、コールバック関数が登録されている場合はfunctionに関数アドレスが設定されます。登録されていない場合は、NULLが設定されます。
functionにNULLを指定した場合でもエラーとはなりません。ただし、コールバック関数が登録されていても関数アドレスは取得できません。
sql_kindには、コールバック関数の登録状況を取得したいSQL文種別を指定します。
SQL文種別に指定できる値は、“7.3.3 SQLSetCallback”を参照してください。
whenに指定できる値は、“7.3.3 SQLSetCallback”を参照してください。
sqlrdbei.hを組み込む必要があります。
異常時の対処
復帰コード | 意味 | 対処 |
|---|---|---|
SQLRDB_ENTRY | 登録済み | - |
SQLRDB_NOENTRY | 未登録 | - |
SQLRDB_EINVAL | パラメタ不当 | ses_id、sql_kindまたはwhenに設定した値を見直してください。 |
SQLRDB_ENOENV | 環境未開設 | セション環境が作成されていません。セションIDまたはSQLThrAllocIDの発行を確認してください。 |
使用例
INSERT文に対するコールバック関数の登録状況を取得し、未登録ならコールバック関数を登録します。
#include <stdio.h>
#include "sqlrdbei.h"
/* コールバック関数のプロトタイプ */
SQLRETURN CFInsertEntry( SQLHDBS, char *, char *, void *, SQLCALL_T * );
SQLRETURN CFInsertExit( SQLHDBS, char *, char *, void *, SQLCALL_T * );
void main()
{
EXEC SQL BEGIN DECLARE SECTION;
char SQLSTATE[6];
char SQLMSG[256];
EXEC SQL END DECLARE SECTION;
SQLRETURN ret;
short kind_list[2];
SQLRETURN (* pfunc_entry)(SQLHDBS, char *,
char *, void *, SQLCALL_T * );
SQLRETURN (* pfunc_exit)(SQLHDBS, char *,
char *, void *, SQLCALL_T * );
/* INSERT文に対する入口コールバック関数の登録状況を取得する。 */
/* 現在、コールバック関数が登録されている場合は、そのアドレスを取得する。*/
kind_list[0] = SQLRDB_CF_INSERT;
kind_list[1] = 0;
ret = SQLGetCallback( 0, &pfunc_entry, SQLRDB_CF_INSERT, SQLRDB_CALL_IN );
if ( ret == SQLRDB_NOENTRY ) {
kind_list[0] = SQLRDB_CF_INSERT;
kind_list[1] = 0;
SQLSetCallback( 0, CFInsertEntry, NULL, kind_list, SQLRDB_CALL_IN );
}
/* INSERT文に対する出口コールバック関数の登録状況を取得する。 */
/* 現在、コールバック関数が登録されている場合は、そのアドレスを取得する。*/
ret = SQLGetCallback( 0, &pfunc_exit, SQLRDB_CF_INSERT, SQLRDB_CALL_OUT );
if ( ret == SQLRDB_NOENTRY ) {
kind_list[0] = SQLRDB_CF_INSERT;
kind_list[1] = 0;
SQLSetCallback( 0, CFInsertExit, NULL, kind_list, SQLRDB_CALL_OUT );
}
EXEC SQL INSERT INTO SCHEMA1.TABLE1( COL01, COL02, COL_KEY )
VALUES ( 1, 2, 3 );
/* 変更前のコールバック関数を復元する。 */
if ( pfunc_entry != NULL ) {
SQLSetCallback( 0, pfunc_entry, NULL, kind_list, SQLRDB_CALL_IN );
}
if ( pfunc_exit != NULL ) {
SQLSetCallback( 0, pfunc_exit, NULL, kind_list, SQLRDB_CALL_OUT );
}
return;
}
SQLRETURN CFInsertEntry( 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 CFInsertExit( 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 );
printf( "SQLSTATE : %s\n", sqlstate );
printf( "SQLMSG : %s\n", sqlmsg );
return ( SQLRDB_CONTINUE );
}