ページの先頭行へ戻る
Symfoware Server V11.0.x SQLリファレンス
Symfoware

7.3.3 SQLSetCallback

機能

指定されたSQL文種別に対し、コールバック関数を登録します。

記述形式

SQLRETURN SQLSetCallback (  SQLHDBS  ses_id,
                            SQLRETURN (*コールバック関数名)( SQLHDBS,
                                                              char *,
                                                              char *,
                                                              void *,
                                                          struct SQLCALL_T * ),
                            void     *user_area,
                            short     sql_kind[],
                            short     when )

一般規則

異常時の対処

復帰コード

意味

対処

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