機能
指定されたSQL文種別に対し、コールバック関数を登録します。
記述形式
SQLRETURN SQLSetCallback ( SQLHDBS ses_id, SQLRETURN (*コールバック関数名)( SQLHDBS, char *, char *, void *, struct SQLCALL_T * ), void *user_area, short sql_kind[], short when )
一般規則
SQLRETURNは、2バイトの整数型です。
マルチスレッドで動作するアプリケーションの場合は、ses_idにセションIDを指定します。シングルスレッドで動作するアプリケーションの場合は、ses_idに0を指定します。
コールバック関数名には、登録するコールバック関数の関数アドレスを指定します。コールバック関数の詳細は“7.3.4 コールバック関数”を参照してください。
SQLCallbackFunctionにNULLを指定すると、コールバック関数の登録を解除することができます。
user_areaには、ユーザが定義する領域のアドレスを指定します。このアドレスは、コールバック関数がコールされるとき第4パラメタに設定されます。
sql_kindには、コールバック関数を登録するSQL文種別のリストを指定します。SQL文種別はshort型の配列で指定し、配列の最後は0を指定します。
SQL文種別には以下の定数を指定します。
SQL文種別 | 指定値 |
---|---|
ALLOCATE DESCRIPTOR文 | SQLRDB_CF_ALLOC_DESC |
CALL文 | SQLRDB_CF_CALL |
CLOSE文 | SQLRDB_CF_CLOSE |
COMMIT文 | SQLRDB_CF_COMMIT |
CONNECT文 | SQLRDB_CF_CONNECT |
DEALLOCATE DESCRIPTOR文 | SQLRDB_CF_DEALLOC_DESC |
DEALLOCATE PREPARE文 | SQLRDB_CF_DEALLOC_PREPARE |
DELETE文:位置づけ | SQLRDB_CF_DELETE_POSITION |
DELETE文:探索 | SQLRDB_CF_DELETE_SEARCH |
DESCRIBE文 | SQLRDB_CF_DESCRIBE |
DISCONNECT文 | SQLRDB_CF_DISCONNECT |
EXECUTE IMMEDIATE文 | SQLRDB_CF_EXECUTE_IMME |
EXECUTE文 | SQLRDB_CF_EXECUTE |
FETCH文 | SQLRDB_CF_FETCH |
GET DESCRIPTOR文 | SQLRDB_CF_GET_DESC |
INSERT文 | SQLRDB_CF_INSERT |
OPEN文 | SQLRDB_CF_OPEN |
PREPARE文 | SQLRDB_CF_PREPARE |
RELEASE文 | SQLRDB_CF_RELEASE |
ROLLBACK文 | SQLRDB_CF_ROLLBACK |
SET CATALOG文 | SQLRDB_CF_SET_CATALOG |
SET CONNECTION文 | SQLRDB_CF_SET_CONNECT |
SET DESCRIPTOR文 | SQLRDB_CF_SET_DESC |
SET ROLE文 | SQLRDB_CF_SET_ROLE |
SET SCHEMA文 | SQLRDB_CF_SET_SCHEMA |
SET SESSION AUTHORIZATION文 | SQLRDB_CF_SET_SESSION |
SET TRANSACTION文 | SQLRDB_CF_SET_TRANSACTION |
SET USER PASSWORD文 | SQLRDB_CF_SET_USER |
UPDATE文:位置づけ | SQLRDB_CF_UPDATE_POSITION |
UPDATE文:探索 | SQLRDB_CF_UPDATE_SEARCH |
単一行SELECT文 | SQLRDB_CF_SELECT |
コールバック関数は、プロシジャルーチン内のSQL文は対象となりません。
whenには目的に応じて以下の定数を指定します。
when | 意味 |
---|---|
SQLRDB_CALL_IN | 入口コールバック関数として登録します。 |
SQLRDB_CALL_OUT | 出口コールバック関数として登録します。 |
コールバック関数は、マルチスレッドで動作するアプリケーションの場合は、SQLThrAllocID関数によりセションを作成した後はいつでも登録できます。シングルスレッドで動作するアプリケーションの場合は、いつでも登録することができます。
sqlrdbei.hを組み込む必要があります。
異常時の対処
復帰コード | 意味 | 対処 |
---|---|---|
SQLRDB_NORMAL | 正常終了 | - |
SQLRDB_EINVAL | パラメタ不当 | ses_id、sql_kindまたはwhenに設定した値を見直してください。 |
SQLRDB_ENOENV | 環境未開設 | セション環境が作成されていません。セションIDまたはSQLThrAllocIDの発行を確認してください。 |
使用例
INSERT文、DELETE文、UPDATE文および単一行SELECT文にコールバック関数を登録します。
#include <stdio.h> #include "sqlrdbei.h" /* コールバック関数のプロトタイプ */ SQLRETURN CFEntry1( SQLHDBS, char *, char *, void *, SQLCALL_T * ); SQLRETURN CFEntry2( SQLHDBS, char *, char *, void *, SQLCALL_T * ); void main() { EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; char SQLMSG[256]; short col01; short col02; short key_dat; EXEC SQL END DECLARE SECTION; SQLRETURN ret; short kind_list[5]; /* CBEntry1をINSERT文、DELETE文、UPDATE文、単一行SELECT文 */ /* の入口コールバック関数に登録する。*/ kind_list[0] = SQLRDB_CF_INSERT; kind_list[1] = SQLRDB_CF_DELETE_SEARCH; kind_list[2] = SQLRDB_CF_UPDATE_SEARCH; kind_list[3] = SQLRDB_CF_SELECT; kind_list[4] = 0; ret = SQLSetCallback( 0, CFEntry1, NULL, kind_list, SQLRDB_CALL_IN ); EXEC SQL INSERT INTO SCHEMA1.TABLE1( COL01, COL02, COL_KEY ) VALUES ( 1, 2, 100 ); ・・・(1) EXEC SQL UPDATE SCHEMA1.TABLE1 SET COL01 = 10, COL02 = 20 WHERE COL_KEY = 100; ・・・(1) EXEC SQL SELECT COL01, COL02, COL_KEY INTO :col01, :col02 FROM SCHEMA1.TABLE1 WHERE COL_KEY = 100; ・・・(1) EXEC SQL DELETE FROM SCHEMA1.TABLE1 WHERE COL_KEY = 100; ・・・(1) /* INSERT文、DELETE文の入口コールバック関数をCBEntry2に変更する。 */ kind_list[0] = SQLRDB_CF_INSERT; kind_list[1] = SQLRDB_CF_DELETE_SEARCH; kind_list[2] = 0; ret = SQLSetCallback( 0, CFEntry2, NULL, kind_list, SQLRDB_CALL_IN ); /* 単一行SELECT文の入口コールバック関数を解除する。 */ kind_list[0] = SQLRDB_CF_SELECT; kind_list[1] = 0; ret = SQLSetCallback( 0, NULL, NULL, kind_list, SQLRDB_CALL_IN ); EXEC SQL INSERT INTO SCHEMA1.TABLE1( COL01, COL02, COL_KEY ) VALUES ( 1,2,101 ); ・・・(2) EXEC SQL UPDATE SCHEMA1.TABLE1 SET COL01 = 5, COL02 = 6 WHERE COL_KEY = 101; ・・・(1) EXEC SQL SELECT COL01, COL02, COL_KEY INTO :col01, :col02 FROM SCHEMA1.TABLE1 WHERE COL_KEY = 101; ・・・(3) EXEC SQL DELETE FROM SCHEMA1.TABLE1 WHERE COL_KEY = 101; ・・・(2) return; } SQLRETURN CFEntry1( 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 CFEntry2( 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 ); }
(1) 入口コールバック関数としてCBEntry1がコールされる。
(2) 入口コールバック関数としてCBEntry2がコールされる。
(3) 入口コールバック関数はコールされない。