2016-06-22 8 views
1

私は、PreparedStatementをORACLEとMYSQLの両方で実行することを想定しています。 しかし、私はOracleでJava PreparedStatementキャスト付きのDB間

(... NULL AS)CASTを処理する方法を見つけ出すことはできません(ただし、MySQLの上)以下の作品:MySQLのオン

SELECT TIMB_INS, 
CAST(NULL AS TIMESTAMP) AS TIMB_CLO 
FROM TOPS 

次作品(ただし、上オラクル):

SELECT TIMB_INS, 
CAST(NULL AS DATETIME) AS TIMB_CLO 
FROM TOPS 

(最初の列は、MySQLは、OracleとDATETIMEのために、すなわちTIMESTAMPを、 "TIMB_INS" を選択し、両方のケースではターゲット・データベース・タイプのための正しいデータ型を返すことに注意してください)

両方に機能するように配置する方法はありますか? I.E。私はそれを何らかの方法でdb-indipendentにすることはできますか?私はあなたには、いくつかのJavaコードからこの文を呼んでいる見ることができますタグに基づいて

おかげ マルコ

答えて

1

  • DAOパターンを使用します。そうすることはいくつかの方法があります。私。各SQLフレーバに対して、SQL-sを含むjavaファイルを提供します。
  • HibernateまたはJPAのようなORMを使用してください。それはこの種の違いを処理します。
  • 以下のスニペットのように、簡単にハックすると、SQLを手動で編集できます。しかし、基礎となるデータベースがOracleかMySQLかどうかを判断する必要があります

    文字列SQL_PATTERN = "... CAST(NULL AS%s)AS TIMB_CLO ...";

    文字列SQL = String.format(SQL_PATTERN、isOracle? "TIMESTAMP": "DATETIME");

+0

はい、スタンドアロンJavaアプリケーションからの呼び出しです。 私はあなたの3番目の解決策は、トリックを行うかもしれないと思うが、私はそれを(華麗に?しかし、それは単に可能ではないかもしれません。 (お返事ありがとうございます!) –

+0

多分SQLソリューションもあります。私はちょうどあなたのためにそれらを試すためのツールがありません。 –

+1

もう1つ - それほど賢くない解決策は、両方のDBで、そのテーブルに希望のタイプのNOT USED(NULL)列を追加して選択することです。 しかし、わかりやすくするために、私たちはあなたの3番目の解決策に行きました。 db.nameを "connection.getMetaData()。getDatabaseProductName()"から調べました。 ありがとう! ;-)さようなら。 –

関連する問題