4

私の友人、

C アプリの既存の DB で PostgreSQL libpqtypes ライブラリを使用したいと考えています。

私が実行しなければならない SQL ステートメントの 1 つは、NULL 可能である int 列を持つテーブルへの挿入です。ここでは、単純化して次のように単純化したスキーマがあります。

create table t (
    a int null
);

libpqtypes PQputf および PQexecf 関数のドキュメントを読んでいますが、SQL null 値をパラメーター化された SQL ステートメントに渡す方法については言及されていません。

これは int 列であり、DB に格納されている値を 0 ではなく SQL null にしたいため、C NULL 値を渡したくありません。したがって、これを行いたくありません。

PQexecf(conn, "INSERT INTO t (a) VALUES (%int4)", NULL);

PQexecf に渡される挿入 SQL ステートメントのフォーマット文字列を生成するときに null を直接含めることができますが、null 以外の値を挿入する必要がある場合があるため、これを行うことは望ましくありません。だから私はこれをしたくありません:

PQexecf(conn, "INSERT INTO t (a) VALUES (null)");

PQexecf を呼び出すときに 1 つの一般的な形式の SQL 挿入ステートメント文字列を使用し、値がない場合はどうにかして null パラメーター値を渡すことが私の望みであり野心です。SQL_NULL は、DB に SQL null を挿入する必要があることを libpqtypes に伝える何らかの方法です。

void insert(int *a) {
    /* Other source codes. */

    PQexecf(conn, "INSERT INTO t (a) VALUES (%int4)", a ? *a : SQL_NULL);

    /* Other source codes. */
}

これは可能ですか?どうすればいいですか?

たくさん、たくさんありがとう!

4

2 に答える 2

0

私が見る限り、libpqtypes だけを使用することは不可能です (ただし、libpqtypes を自分で使用したことはありません)。

追加の C コードをあまり必要としない回避策は、"NULL" の代わりになる値を 1 つ選択NULLIFし、ステートメントで使用してそれを SQL NULL に変換することです。

// treat -1 as NULL
PQexecf(conn, "INSERT INTO t (a) VALUES (NULLLIF(%int4, -1))", a ? *a : -1);
于 2013-09-15T00:27:50.943 に答える