【问题标题】:Do a DB2 insert with a select and parameters使用选择和参数执行 DB2 插入
【发布时间】:2011-04-06 23:33:59
【问题描述】:

我想做这样的事情:

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
这似乎表明
参数标记的使用无效?

【问题讨论】:

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

标签: sql jdbc db2 spring-jdbc


【解决方案1】:

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

例如:

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

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

【讨论】:

  • 解决了 1 个问题,提出了新问题
  • 如果我做了一个特定的演员表就可以工作..就像演员表(?as char(8))..就像char还不够
【解决方案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 驱动程序根本不吃PreparedStatement 中的INSERT INTO ... SELECT ... 语句。尚不清楚 SQL 消息参考中是否缺少该内容或 JDBC 驱动程序中的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多