在 prepareStatement 中使用 COALESCE 来“插入”cmd

Posted

技术标签:

【中文标题】在 prepareStatement 中使用 COALESCE 来“插入”cmd【英文标题】:Use COALESCE in prepareStatement for "insert into" cmd 【发布时间】:2020-05-04 13:22:50 【问题描述】:

我试图在 cmd 下执行,但这个抛出异常:

org.hsqldb.HsqlException: 操作中的数据类型不兼容

conn.prepareStatement("INSERT INTO TableA (colA) VALUES (IFNULL(?, 1)))

这里 TableA 的 colA 具有整数数据类型。 但是,如果我将 cmd 以上更改为

conn.prepareStatement("INSERT INTO TableA (colA) VALUES(IFNULL(null, 1)))

工作正常但没有任何意义,因为想在运行时传递 colA 值。

代码:

   ps = conn.prepareStatement("INSERT INTO TableA (colA) VALUES(IFNULL(?, 1))")

   ps.setObject(1, 5);  // this cmd doesn't have any problem code is failing at preparestatement itself

【问题讨论】:

edit您的问题并添加您的Java代码。 我认为这是传递参数的问题,而不是代码。参数如何设置?澄清你的问题。 只有两行代码 这应该适用于最新版本的 HSQLDB。你用的是哪个版本? CREATE TABLE 语句是什么? 【参考方案1】:

setObject 是通用的,所以如果你想强制使用一个类型,你可以使用如下第三个参数:

ps.setObject(1, 5, JDBCType.INTEGER);

因为你使用了一个常量值,所以你的编译器必须决定是整数还是其他数值类型。

你也可以写

Integer myValue = 5;
ps.setObject(1, myValue);

Integer myValue = 5;
ps.setObject(1, myValue.intValue());

【讨论】:

@BhawaniSingh 请发布您在我的代码中遇到的错误 在执行conn.prepareStatement("INSERT INTO TableA (colA) VALUES (IFNULL(?, 1))") 行时得到org.hsqldb.HsqlException: incompatible data type in operation @BhawaniSingh 你确定 colA 有整数作为数据类型吗?【参考方案2】:

使用setInt 代替setObject

ps.setInt(1, 5);

【讨论】:

prepareStatement 本身失败

以上是关于在 prepareStatement 中使用 COALESCE 来“插入”cmd的主要内容,如果未能解决你的问题,请参考以下文章

JDBC PrepareStatement对象执行批量处理实例

如何使用 PrepareStatement 在 Java 中执行 INSERT SELECT INTO

prepareStatement与Statement的区别

JDBC中PrepareStatement 和Statement

使用控制器中的 prepareStatement 向表中插入多行失败

如何使用preparestatement而不在我的连接类中实现方法