2016-06-22 10 views
1

Ich habe ein PreparedStatement, das sowohl auf ORACLE als auch auf MYSQL ausgeführt werden soll. Aber ich kann nicht herausfinden, wie die CAST (NULL AS ...) die folgenden WerkeJava PreparedStatement Cross-DB mit Casting

auf Oracle zu handhaben (aber nicht auf Mysql):

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

Auf Mysql folgende Arbeiten (aber nicht auf Oracle):

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

(Bitte beachten Sie, dass die erste Spalte ausgewählt, „TIMB_INS“, gibt den richtigen Datentyp für den Zieldatenbanktyp in beiden Fällen, dh Zeitstempel für Oracle und DATETIME- für MySql)

.

Es gibt eine Möglichkeit, es so zu setzen, dass es für beide funktioniert? I.E. Kann ich es in irgendeiner Weise db-unabhängig machen?

Dank Marco

Antwort

1

Die Tags Basierend ich Sie anrufen diese Aussage von einem Java-Code sehen. Es gibt mehrere Möglichkeiten, dies zu tun:

  • Verwenden Sie das Muster DAO. I.e. Stellen Sie für jede SQL-Variante eine Java-Datei bereit, die die SQL-s enthält.
  • Verwenden Sie ein ORM wie Hibernate oder JPA. Das wird für diese Art von Unterschieden sorgen.
  • Als schnellen Hack können Sie die SQL manuell bearbeiten, wie im folgenden Ausschnitt. Aber dann müssen Sie irgendwie feststellen, ob die zugrunde liegende Datenbank Oracle oder MySQL ist

    String SQL_PATTERN = "... CAST (NULL AS% s) AS TIMB_CLO ...";

    Zeichenfolge SQL = String.format (SQL_PATTERN, isOracle? "TIMESTAMP": "DATETIME");

+0

Ja, es ist ein Anruf von einer eigenständigen Java-Anwendung. Ich denke, dass Ihre dritte Lösung den Trick tun könnte, obwohl ich es (brilliant?) Von sql nur lösen wollte. Aber vielleicht ist es einfach nicht möglich. (Vielen Dank für Ihre schnelle Antwort!) –

+0

Vielleicht gibt es auch eine SQL-Lösung. Ich habe einfach nicht die Werkzeuge, um mit denen für Sie zu experimentieren. –

+1

Eine andere - nicht so brillante - Lösung würde in dieser Tabelle in beiden DBs eine NOT USED (Null) -Spalte des gewünschten Typs hinzufügen und auswählen. Aus Gründen der Einfachheit haben wir uns jedoch für Ihre dritte Lösung entschieden. Wir haben den DB-Namen von "connection.getMetaData(). GetDatabaseProductName()" gesehen. Danke! ;-) Tschüss. –