10

我想做这样的事情:

INSERT INTO TABLEA
(
 COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, ?
FROM TABLEB

然后通过 Spring JDBC 将其发送到 JDBC 以更新...

simpleJdbcTemplate.update( mySqlFromAbove, someVariableToReplaceQuestionMark );

这甚至可能吗?如果我在构建我的 SQL 查询时用硬编码值替换问号会很好,但我不想让自己接受 SQL 注入......

编辑 -
我得到
嵌套异常是 com.ibm.db2.jcc.c.SqlException: DB2 SQL 错误:SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: null
这似乎表明
参数标记的使用无效?

4

2 回答 2

12

您需要对参数标记进行类型转换,以便 DB2 知道会发生什么。

例如:

INSERT INTO TABLEA
(
 COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, cast(? as int)
FROM TABLEB

显然,转换为适当的类型—— int 只是一个例子。

于 2010-09-02T01:07:16.313 回答
2

这是DB2 SQL 消息参考。以下是您检索到的 SQLCODE 和 SQLSTATE 的相关性摘录:

SQL0418N

语句包含对无效参数标记的使用。

解释:

不能使用无类型参数标记:

  • 在 SELECT 列表中
  • 作为日期时间算术运算的唯一参数
  • 在某些情况下作为标量函数的唯一参数
  • 作为 ORDER BY 子句中的排序键

永远不能使用参数标记:

  • 在不是准备好的语句的语句中
  • 在 CREATE VIEW 语句的全选中
  • 在 CREATE TRIGGER 语句的触发动作中
  • 在 DB2 Query Patroller 捕获的查询中

无法处理该语句。

用户响应:

更正语句的语法。如果不允许使用无类型参数标记,请使用 CAST 规范为参数标记提供数据类型。

sql代码:-418

sqlstate: 42610

不幸的是,这并不能解决您的问题,因为您的 SQL 看起来不错。在谷歌搜索更多之后,它看起来更像是 DB2 JDBC 驱动程序根本不吃INSERT INTO ... SELECT .... PreparedStatement尚不清楚 SQL 消息参考中是否缺少该内容或 JDBC 驱动程序中的错误。

于 2010-09-01T23:36:25.050 回答