2012-03-14 13 views
2

Mavenテストケースにderby組み込みデータベースを使用しています。私はTO_DATEの中でSUBSTRを使用することはできません。Derby組み込みデータベースでTO_DATE内でSUBSTRを使用できません

実際には、oracle dbに接続されている元のアプリケーションに使用されていました。今では、Mavenのテストケースを作成していますが、derbyはdbを組み込み、このタスクを実行できません。問題は、元のクエリを変更しないでください。この問題を解決するには、回避策が必要です。

私のクエリは次のようになります。

SELECT TO_DATE(SUBSTR(testdate、1、9)、 'DD-MM-RR')TESTTABLE

FROMこの問題で私を助けてください。ありがとう。

+0

何それはより多くのDBにとらわれないにするために全体のコードスニペットを修正する機会がかかる場合があります正確にエラー? – oers

+0

エラーは「 'DATE'タイプで 'SUBSTR'関数が許可されていません。 – Sivanandam

+0

DERBY組み込みデータベースのSUBSTR()関数をオーバーライドすることはできますか? – Sivanandam

答えて

1

Substrは、DATEには使用できません。それを上書きすることはできません。 SQLはデータベース間で簡単に再利用されません。最も簡単な部分は、SQLを変更することです。

難しい部分はダービーに深くステップです:

クエリを変更せずに、この作品を作りたい場合は、ConnectionまたはDataSourceをラップし、下位レベルの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エラー処理などのサラウンドをすべて処理し、結果を返します設定すると、使用されているDBエンジンをチェックするためのメソッドのオーバーライドを設定できます。 この情報は、databaseMetaData.getDatabaseProductName()またはget。getDriverName()メソッドから取得できます。この文字列をテストして、 'derby'という単語が含まれているかどうかを調べ、そうであれば別のタイプのSQLを送信します。

もちろん、後で元のOracleコードが動作するように最終テストを行う必要があります。

あなたも(すなわち、長いから文字列型(または日付に値をキャスト)、その後、substring関数を実行します。

関連する問題