H2:WHERE子句中的“数据转换错误”

时间:2013-04-22 15:17:41

标签: java database oracle exception h2

我在我的项目中使用H2数据库(v1.3.170)进行JUnit测试。我们的生产环境使用Oracle DB,因此我们必须对从Oracle导出的DDL进行大量转换,以使它们与H2一起使用。我们现在面临的一个问题是:

select * from table_country c where c.code > 0 AND 'USA' = c.name(+)

此查询在Oracle中运行正常,但在H2中以低于堆栈跟踪失败:

org.h2.jdbc.JdbcSQLException: Data conversion error converting "USA"; SQL statement:
select * from table_country c where c.code>0 AND 'USA' = c.name(+) [22018-170] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
    at org.h2.message.DbException.get(DbException.java:158) 
    at org.h2.value.Value.convertTo(Value.java:852) 
    at org.h2.value.Value.getBoolean(Value.java:373) 
    at org.h2.expression.ConditionAndOr.optimize(ConditionAndOr.java:188) 
    at org.h2.command.dml.Select.prepare(Select.java:802) 
    at org.h2.command.Parser.prepareCommand(Parser.java:218) 
    at org.h2.engine.Session.prepareLocal(Session.java:414) 
    at org.h2.server.TcpServerThread.process(TcpServerThread.java:253) 
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:149) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NumberFormatException 
    at java.math.BigDecimal.<init>(Unknown Source) 
    at java.math.BigDecimal.<init>(Unknown Source) 
    at org.h2.value.Value.convertTo(Value.java:801) 
    ... 8 more 

我尝试删除(+) - 它有效:

select * from table_country c where c.code > 0 AND 'USA' = c.name

但正如我所说,我不想在生产中改变它(希望Oracle =&gt; H2转换是透明的)。

请说明可能出现的问题以及解决此问题的更好方法?

1 个答案:

答案 0 :(得分:1)

外部联接的

(+)语法在Oracle中已弃用。停止使用它。

在你的情况下,“外部联接”无论如何都没有意义,因为你没有加入。

您可能想要这样的东西(在所有DBMS中可靠地运行)

select * 
from table_country c 
where c.code > 0 
  and (c.name = 'USA' or c.name is null);

最后一句话:使用不同的DBMS进行测试和生产会使您的测试毫无价值。 DBMS之间存在太多细微差别,使用不同的DBMS时无法覆盖这些差异。