目次 前項目    

4.3 データ操作文の記述方法

データ操作文(SELECT、INSERT、UPDATE、DELETE文など)は、SET TRANSACTION 文の後に、EXEC SQLに続けてSQL文を記述しておくことにより実行させることが できます。
ただし、プログラムの変数の値を SQL 文中で使用する場合には、値を使用する 部分にコロン(:)に続けて変数名を記述します。
また、BASED ON 文を使うことにより、指定フィールドのデータタイプに応じた C 言語のデータ型の変数を定義することができます。


(1) 非問い合わせ文の記述方法

以下は、「3.2 キャラクタセット指定の注意事項」で例としてあげた部署 テーブルにレコードを追加する場合の、フィールドに応じた変数の宣言と INSERT 文の記述例です。


#include <stdio.h>

EXEC SQL
    SET DATABASE DB = "sample.gdb" ;

int  main( int argc, char *argv[] )
{
    BASED ON DEPARTMENTS.DEP_CODE	db_dep_code ;
    BASED ON DEPARTMENTS.DEP_NAME	db_dep_name ;

    /* データベースへの接続、トランザクションの開始など */
                         :

    /* 変数への値の格納 */

    db_dep_code = 1 ;
    strcpy( db_dep_name, "第1営業部" ) ;

    /* レコードの挿入 */

    EXEC SQL
        INSERT INTO DEPARTMENTS VALUES ( :db_dep_code, :db_dep_name ) ;

    /* トランザクションのコミット、データベースとの接続解除など */
                         :
}
      


(2) 単一レコードを返す問い合わせ文の記述方法

単一レコードを返す問い合わせ文は、SELECT INTO 文を使用して、非問い合わせ 文と同様の記述で実行させることができます。
単一レコードを返す問い合わせ文とは、プライマリキーとして定義されている フィールド、またはユニークインデックスが定義されているフィールドに 一致条件を指定した SELECT 文や、COUNT()、SUM()、MAX() などの集合関数を 実行させる SELECT 文です。


#include <stdio.h>

EXEC SQL
    SET DATABASE DB = "sample.gdb" ;

int  main( int argc, char *argv[] )
{
    long	rec_count ;

    /* データベースへの接続、トランザクションの開始など */
                         :

    /* レコード数の集計 */

    EXEC SQL
        SELECT COUNT(*) INTO :rec_count FROM DEPARTMENTS ;

    /* 結果の表示 */

    printf( "レコード数:%d\n", rec_count ) ;

    /* トランザクションのコミット、データベースとの接続解除など */
                         :
}
      


(3) 複数レコードを返す問い合わせ文の記述方法

複数レコードを返す問い合わせ文を実行させる場合は、その結果を取り出す時に カーソルを使用します。

以下は、部署テーブルの全てのレコードを取り出す場合の記述例です。


#include <stdio.h>

EXEC SQL
    SET DATABASE DB = "sample.gdb" ;

int  main( int argc, char *argv[] )
{
    BASED ON DEPARTMENTS.DEP_CODE	db_dep_code ;
    BASED ON DEPARTMENTS.DEP_NAME	db_dep_name ;

    /* データベースへの接続、トランザクションの開始など */
                         :

    /* カーソルの定義 */

    EXEC SQL
        DECLARE DEP_CSR CURSOR FOR
                SELECT DEP_CODE, DEP_NAME FROM DEPARTMENTS ;

    /* カーソルのオープン */

    EXEC SQL
        OPEN DEP_CSR ;

    /* 最初の問い合わせ結果の取り出し */

    EXEC SQL
        FETCH DEP_CSR INTO :db_dep_code, :db_dep_name ;

    /* レコード数分の繰り返し */

    while( !SQLCODE )
    {
        /* 結果の表示 */

        printf( "部署コード:%d\t部署名:%s\n", db_dep_code, db_dep_name ) ;

        /* 次結果の取り出し */

        EXEC SQL
            FETCH DEP_CSR INTO :db_dep_code, :db_dep_name ;
    }

    /* カーソルのクローズ */

    EXEC SQL
        CLOSE DEP_CSR ;

    /* トランザクションのコミット、データベースとの接続解除など */
                         :
}
      



目次 前項目    

InterBase for Linux & FreeBSD Copyright(c) 1998 RIOS Corporation