ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 SQLリファレンス

7.3.2 SQLGetCallback

機能

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

記述形式

SQLRETURN SQLGetCallback (  SQLHDBS    ses_id,
                            SQLRETURN (**function)( SQLHDBS,
                                                    char *,
                                                    char *,
                                                    void *,
                                                    struct SQLCALL_T * ),
                            short     sql_kind,
                            short     when )

一般規則

異常時の対処

復帰コード

意味

対処

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 );
}