使用select和parameters执行DB2插入

时间:2010-09-01 19:02:04

标签: sql jdbc db2 spring-jdbc

我想做这样的事情:

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 个答案:

答案 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)

我们遇到了同样的错误,我们通过回收服务器来解决问题。如有疑问,请重新启动。