ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

A.12 状態変数およびメッセージ変数の使用例

状態変数とメッセージ変数を使用し、SQL文の実行結果を確認するサンプルプログラムを以下に示します。サンプルプログラムには、SQL文実行時にエラーが発生した場合の処理を記述しています。

例1

状態変数およびメッセージ変数の内容をチェックし、エラーが発生している場合はSQLSTATE値およびメッセージを出力する例

#include<stdio.h>
#include<string.h>

EXEC  SQL  BEGIN  DECLARE  SECTION;
    char    SQLSTATE[6];
    char    SQLMSG[256];
    short   number;
    struct {
        long    num;
        char    name[21];
        char    atta[41];
        short   year;
    } data;
EXEC  SQL  END  DECLARE  SECTION;

main(void){

    memset( SQLSTATE, '\0' , 6 );
    memset( SQLMSG, '\0' , 256 );

    EXEC SQL CONNECT TO 'DB01';
    if ( strcmp( SQLSTATE, "00000" ) != 0 ) {
        printf( "SQLSTATE %s\n", SQLSTATE );
        printf( "SQLMSG   %s\n", SQLMSG );
    }

    number = 1;
    /* データの取得 */
    EXEC SQL SELECT COL01, COL02, COL03, COL04 INTO :data
             FROM SCH01.TBL01
             WHERE NUMBER = :number;
    if ( strcmp( SQLSTATE, "00000" ) != 0 ) {
        printf( "SQLSTATE %s\n", SQLSTATE );
        printf( "SQLMSG   %s\n", SQLMSG );
    }

    printf( "COL1=%d\n", data.num );
    printf( "COL2=%s\n", data.name );
    printf( "COL3=%s\n", data.atta );
    printf( "COL4=%d\n", data.year );

    EXEC SQL COMMIT WORK;

    EXEC SQL DISCONNECT 'DB01';

    return 1;
}
例2

WHENEVER文を使用し、SQL文の実行時にエラーが発生した場合、SQLSTATE値およびメッセージを出力する例

#include<stdio.h>
#include<string.h>

EXEC  SQL  BEGIN  DECLARE  SECTION;
    char    SQLSTATE[6];
    char    SQLMSG[256];
    short   number;
    struct {
        long    num;
        char    name[21];
        char    atta[41];
        short   year;
    } data;
EXEC  SQL  END  DECLARE  SECTION;

 main(void){

    memset( SQLSTATE, '\0' , 6 );
    memset( SQLMSG, '\0' , 256 );

    EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

    EXEC SQL CONNECT TO 'DB01';

    EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;
    EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

    number = 1;

    /* データの取得 */
    EXEC SQL SELECT COL01, COL02, COL03, COL04 INTO :data
             FROM SCH01.TBL01
             WHERE NUMBER = :number;

    printf( "COL1=%d\n", data.num );
    printf( "COL2=%s\n", data.name );
    printf( "COL3=%s\n", data.atta );
    printf( "COL4=%d\n", data.year );

    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL COMMIT WORK;
    EXEC SQL DISCONNECT 'DB01';

    return 1;

STM_ERROR:
    printf( "SQLSTATE %s\n", SQLSTATE );
    printf( "SQLMSG   %s\n", SQLMSG );
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL COMMIT WORK;
    EXEC SQL DISCONNECT 'DB01';

    return 1;

NOT_FOUND_ERROR:
    printf( "SQLSTATE %s\n", SQLSTATE );
    printf( "SQLMSG   %s\n", SQLMSG );
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL ROLLBACK WORK;
    EXEC SQL DISCONNECT 'DB01';

    return 0;

CONNECT_ERROR:
    printf( "SQLSTATE %s\n", SQLSTATE );
    printf( "SQLMSG   %s\n", SQLMSG );

    return 1;
}