3

Informix 11.7を使用して、次のようにselectステートメントでjdbc位置パラメーターを使用してINSERTSELECTクエリを実行しようとしています。

INSERT INTO table1(id, code, label) 
SELECT ?, ?, ? FROM table2
WHERE ...

パラメータは次のように設定されます:

 stmt.setString(1, "auniqueid");
 stmt.setString(2, "code");
 stmt.setString(3, "coollabel");

次のエラーが発生します:

スレッド"main"の例外java.sql.SQLException:構文エラーが発生しました。

位置パラメータが「?」他の場所に配置すると正常に動作します。PostgreSQLを使用してもこの問題はありません。私のクエリの何が問題になっていますか?Informix JDBC Driverv3.70JC1を使用しています。

ご協力いただきありがとうございます。

4

2 に答える 2

3

プレースホルダーを介して指定された列名を取得することを期待していますか? もしそうなら、あなたは何にも隠れていません。列名やテーブル名など、クエリの構造要素にプレースホルダーを使用することはできません。それらは値を置き換えることしかできません。動的 SQL で列を指定する場合は、動的 SQL を使用してください。次の内容で文字列を作成します。

INSERT INTO table1(id, code, label)
    SELECT auniqueid, code, coollabel
      FROM table2
     WHERE ...

そしてそれで作業します。

これらのプレースホルダーが値になる場合は、クエリによって返される行ごとに 1 回、同じ値を何度も挿入することになりますが、これは通常、必要なことではありません。プレースホルダーが許可されている場合は、VALUES 句を使用して 1 つの行を挿入するだけです。

INSERT INTO table1(id, code, label) VALUES(?, ?, ?);

それはうまくいくでしょう。

私の知る限り、この動作はSQL標準に準拠しています。PostgreSQL での動作が異なる場合、PostgreSQL は標準の拡張機能を提供しています。

于 2013-02-01T19:14:30.237 に答える
1

警告: 私は Informix の経験がありません。回答は一般的な観察に基づいています。

パラメータを指定する場合、データベースは各パラメータのタイプを認識する必要があります。パラメータが選択リストにある場合、データベースがパラメータのタイプを推測する方法はありません。一部のデータベースは、実際にパラメーターを受け取るまでその決定を遅らせることができる場合がありますが、ほとんどのデータベースは解析時にこれを知る必要があります。これがおそらくエラーを受け取る理由です。

一部のデータベース (これが Informix に当てはまるかどうかはわかりません) では、パラメーターをキャストできます。たとえば、次のようになります。

SELECT CAST(? AS VARCHAR(20)), CAST(? AS VARCHAR(10)), CAST(? AS VARCHAR(5)) FROM ...

その場合、データベースはパラメーターの型を推測し、クエリを正しく解析できます。

これにより、パラメーターを使用して選択リストの列名を指定しようとしていないと仮定します。これは不可能であるためです。

于 2013-02-01T16:57:48.517 に答える