INSERT SELECT不起作用

时间:2013-02-01 16:05:24

标签: jdbc insert informix insert-select

使用Informix 11.7,我试图在select语句中使用jdbc位置参数执行INSERT SELECT查询,如下所示:

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驱动程序v3.70 JC1。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您是否希望通过占位符指定列名?如果是这样的话,那你就隐藏起来了;您不能将占位符用于查询的结构元素,例如列名或表名。他们只能取代价值观。如果希望动态SQL指定列,请使用动态SQL;创建一个包含内容的字符串:

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

并与之合作。

如果这些占位符将成为值,那么您将反复插入相同的值,对于查询返回的每一行,一次,这通常不是您想要的;你只需要插入一行VALUES子句,允许占位符:

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

这样可以正常工作。

AFAIK,此行为符合SQL标准。如果它在PostgreSQL中的工作方式不同,那么PostgreSQL就提供了标准的扩展。

答案 1 :(得分:1)

警告:我没有使用Informix的经验,答案是基于一般观察

指定参数时,数据库需要知道每个参数的类型。如果参数列表中出现参数,则数据库无法推断参数的类型。某些数据库可能能够推迟该决定,直到它实际收到参数,但大多数数据库需要在分析时知道这一点。这可能是您收到错误的原因。

某些数据库 - 我不知道这是否适用于Informix - 允许您转换参数。例如:

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

在这种情况下,数据库将能够推断出参数类型并能够正确解析查询。

有了这个,我假设您没有尝试使用参数为select-list指定列名,因为这是不可能的。