2012-03-14 27 views
2

我正在使用德比嵌入式數據庫來處理我的Maven測試用例。而且我不能在TO_DATE內使用SUBSTR,它給出錯誤。無法在德比嵌入式數據庫的TO_DATE內使用SUBSTR

實際上它被用於連接到oracle數據庫的原始應用程序。現在我正在寫Maven測試用例,用derby嵌入數據庫並且無法執行這個。事情是我不應該修改原來的查詢,我需要一些解決方法來糾正這個問題。

我的查詢會是這樣的。

SELECT TO_DATE(SUBSTR(testdate,1,9), 'DD-MM-RR')FROM TestTable的

請幫我在這個問題上。謝謝。

+0

什麼錯誤到底? – oers 2012-03-14 08:04:03

+0

錯誤是「The'SUBSTR'功能在'DATE'類型上不被允許。」 – Sivanandam 2012-03-14 08:56:16

+0

我可以重寫DERBY嵌入式數據庫中的SUBSTR()函數嗎? – Sivanandam 2012-03-14 09:34:46

回答

1

Substr不能與DATE一起使用。你不能重寫它。 SQL不容易在數據庫之間重複使用。最簡單的部分是更改SQL。

比較困難的部分是深踏入德比:

如果你想使這項工作沒有更改查詢,你可以換連接或數據源,並改變在一個較低的水平上SQL。

對於這個工作,你需要訪問Connection對象在您的測試:

Connection wrapped = new WrappedConnection(originalConnection); 

這是一個包裹連接的一個簡單例子,一個migrate功能(這基本上是Adapter Pattern

public class WrappedConnection implements Connection 
{ 

    private final Connection origConnection; 


    public WrappedConnection(Connection rv) 
    { 
    origConnection = rv; 
    } 

    //I left out other methods, that you have to implement accordingly 

    public PreparedStatement prepareStatement(String pSql) throws SQLException 
    { 
    //this you have to implement yourself 
    //this will serve as a bridge between oracle and derby 
    String sql = migrate(sql); 

    return sql; 
    } 
} 

migrate功能可以以這樣的事:

public String migrate(String sql) 
{ 
    return sql.replace("SUBSTR", "SUBSTR_DATE"); 
} 

但是你必須create your own Derby Function SUBSTR_DATE。

0

我能想到的2個選項...我不知道有多少的意義要麼使得但是......

創建一個子類的原始的,和(假設該訂單是一個僅用於該類的方法)簡單地覆蓋該單一方法。並保留其餘代碼相同。

如果調用此SQL的類將消息發送到自定義的'sendSQLStatement(String sql)tpe方法,它將處理所有創建的語句對象,包含try/catch錯誤處理等,並返回結果設置,您可以在方法中設置一個覆蓋,以檢查正在使用的數據庫引擎。 此信息可從databaseMetaData.getDatabaseProductName()獲得,也可從get。getDriverName()方法獲得。然後測試該字符串以查看它是否包含單詞「derby」,如果是,則發送不同類型的SQL。

當然後來你還需要進行最後的測試,以確保原始的Oracle代碼仍然有效。

你甚至可以趁機修改整個代碼片段,以使其更DB無關(即值轉換爲字符串類型(或從長日期),然後執行字符串函數。