2013-04-22 59 views
2

我在我的項目中使用H2數據庫(v1.3.170)進行JUnit測試。我們的生產環境使用Oracle DB,因此我們必須對從Oracle導出的DDL進行大量轉換,以使它們能夠與H2一起工作。一個我們所面臨現在的問題是以下幾點:H2:WHERE子句中的「數據轉換錯誤」

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

此查詢工作在甲骨文罰款,但在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 

但正如我所說的,我不想在生產中更改此(希望甲骨文=> H2的轉換是透明的)。

請建議可能是什麼問題和更好的方法來解決這個問題?

回答

1

(+)外連接的語法在Oracle中不推薦使用。停止使用它。

在你的情況下,「外部連接」並不是真的有意義,因爲你沒有加入。

你可能想是這樣的(這在所有DBMS工作可靠)

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

的最後一個字:使用不同的數據庫管理系統,用於測試和生產,使您的測試毫無價值。數據庫管理系統之間存在太多細微的差異,在使用不同的數據庫管理系統時無法覆蓋。

+0

我同意,除了我相信使用不同的DBMS進行測試有一些優點,例如,您可以更輕鬆地運行單元測試(因爲您的開發人員機器上可能沒有Oracle)。另外在許多情況下,單元測試更快,特別是在使用內存數據庫時。使用模擬對象進行測試的原因是相同的:是的,它們可能不像真實環境那樣運行。但是測試環境在定義上是對現實世界的簡化。實際上大多數節目都是關於簡化現實世界的。 – 2013-04-22 15:38:30

+0

@ThomasMueller:我理解這個推理,但根據我的經驗,這根本行不通。考慮一下簡單的(ANSI SQL)語句:'select * from foo where order_date 2013-04-22 15:52:42

+0

@a_horse_with_no_name表示「在Oracle中不贊成(+)外連接的語法」。你確定 ? – haki 2013-04-22 16:26:37