機能
指定された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) 入口コールバック関数はコールされない。