【发布时间】:2021-05-03 14:36:52
【问题描述】:
我有以下列:
...
some_column NUMBER(1, 0) DEFAULT NULL NULL,
...
用于保存可以为空的Integer 值。
现在我有一行填充了该列。我正在使用 Spring 的 JdbcTemplate 执行补丁,这意味着我只想在新值不为空时更新列:
UPDATE my_table SET some_column = COALESCE(?, some_column) WHERE...
这失败了:
Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
当我将 Java null 传递给 ? 时。这意味着COALESCE 不高兴,因为我向其中传递了两种不同的类型。我最初的假设是 Spring/JdbcTemplate 不知何故不会将 SQL null 传递给数据库,因为直接更新到数据库:
UPDATE my_table SET some_column = COALESCE(null, some_column) WHERE...
工作正常。但是,当我将查询替换为:
UPDATE my_table SET some_column = NVL(?, some_column) WHERE...
我通过JdbcTemplate 得到我想要的。这是怎么回事,区别在哪里?
更新:
我使用的Java代码如下:
我有:
public class MyClass {
private MyEnum enum;
// Getters and setters
}
和MyEnum:
public enum MyEnum implements Serializable {
SOME_VAL (0),
SOME_OTHER_VAL (1),
...
private final int status;
MyEnum (int status) {
this.status = status;
}
public int getStatus() {
return status;
}
getJdbcTemplate().update("UPDATE my_table SET some_column = COALESCE(?, some_column) WHERE...", myClass.getMyEnum() == null ? null : myClass.getMyEnum().getStatus());
【问题讨论】:
-
听起来您将值绑定为字符串,而不是数字;这会产生这种效果。 (这两个函数的文档显示了不同的隐式数据类型行为,但您可以see it here。)您如何提供绑定值?
-
请edit您的问题并添加您正在使用的Java代码。
-
@a_horse_with_no_name 我刚刚编辑了我的问题以显示 Java 代码。
-
@AlexPoole 我刚刚编辑了我的问题以显示 Java 代码。
-
当占位符具有非空值和空值时,
NVL的使用是否有效?
标签: oracle spring-boot jdbctemplate coalesce nvl