動的 SQL

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 29章ECPG - C言語による埋め込みSQL | 早送り | 次のページ

# 29.7. 動的 SQL

多くの場合、アプリケーションが実行しなければならない具体的なSQL文はアプリケーションの作成時にわかっています。 しかし、そのSQL文が実行時に組み立てられる場合や外部ソースによって与えられる場合があります。 こうした場合では、Cソースコード内に直接SQL文を埋め込むことができません。 しかし、文字列変数で提供した任意のSQL文を呼び出すことを可能にする機能があります。

任意のSQL文を実行する最も簡単な方法は、`EXECUTE IMMEDIATE`コマンドを使用することです。 以下に例を示します。

    EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt = "CREATE TABLE test1 (...);";
    EXEC SQL END DECLARE SECTION;

    EXEC SQL EXECUTE IMMEDIATE :stmt;

この方法ではデータを取り出す文(例えば`SELECT`)を実行することができません。

任意のSQL文を実行する、より強力な方法は、それを一旦準備し、実行したい時に準備された文を実行することです。 汎用化した文を準備し、パラメータで置換して具体化した形で実行させることも可能です。 文を準備する時は、後でパラメータで置換したい所にクエッションマークを書いてください。 以下に例を示します。

    EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
    EXEC SQL END DECLARE SECTION;

    EXEC SQL PREPARE mystmt FROM :stmt;
     ...
    EXEC SQL EXECUTE mystmt USING 42, 'foobar';

実行する文が値を返す場合は、以下のように`INTO`句を追加してください。

    EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt = "SELECT a, b, c FROM test1 WHERE a > ?";
    int v1, v2;
    VARCHAR v3;
    EXEC SQL END DECLARE SECTION;

    EXEC SQL PREPARE mystmt FROM :stmt;
     ...
    EXEC SQL EXECUTE mystmt INTO v1, v2, v3 USING 37;

`EXECUTE`コマンドには、1つの`INTO`句、1つの`USING`句、もしくは、その両方を付けることができます。どちらも付けないこともできます。

準備された文が不要になった時点で、それを解放してください。

    EXEC SQL DEALLOCATE PREPARE name;

前のページ | ホーム | 次のページ
ホスト変数の使用 | 上に戻る | SQL記述子領域の使用