機能
指定された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 ); }