使用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。
感谢您的帮助。
答案 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指定列名,因为这是不可能的。