我想做这样的事情:
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
这似乎表明了
参数标记的使用无效?
答案 0 :(得分:12)
您需要对参数标记进行类型转换,以便DB2知道会发生什么。
例如:
INSERT INTO TABLEA
(
COLUMN1, COLUMN2, COLUMN 3
)
SELECT FOOBAR, DOOBAR, cast(? as int)
FROM TABLEB
显然,强制转换为适当的类型 - int只是一个例子。
答案 1 :(得分:2)
这是DB2 SQL Message Reference。以下是您检索到的SQLCODE和SQLSTATE的相关摘录:
SQL0418N
语句包含使用无效的参数标记。
说明:
无法使用无类型参数标记:
- 在SELECT列表中
- 作为日期时间算术运算的唯一参数
- 在某些情况下作为标量函数的唯一参数
- 作为ORDER BY子句中的排序键
永远不能使用参数标记:
- 在一份不是预备陈述的陈述中
- 全面选择CREATE VIEW语句
- 在CREATE TRIGGER语句的触发操作中
DB2 Query Patroller捕获的查询中的无法处理该声明。
用户响应:
更正语句的语法。如果不允许使用无类型参数标记,请使用CAST规范为参数标记指定数据类型。
sqlcode:-418
sqlstate:42610
不幸的是,由于您的SQL似乎很好看,因此无法解决您的问题。在Googling之后,看起来更像是DB2 JDBC驱动程序不会在INSERT INTO ... SELECT ...
中使用PreparedStatement
语句。目前还不清楚SQL消息参考中是否缺少该消息或JDBC驱动程序中的错误。
答案 2 :(得分:1)
应该可以正常工作。并且+1为“无SQL注入”。
分享并享受。
答案 3 :(得分:1)
我们遇到了同样的错误,我们通过回收服务器来解决问题。如有疑问,请重新启动。