Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Konvertieren einer DB2-Abfrage in eine Oracle-Abfrage

Sie haben viel Arbeit vor sich!

Zwischen DB2 und Oracle gibt es einige wichtige Unterschiede (nur eine willkürliche Aufzählung dessen, was mir einfällt):

Datentypen

  • Anzahl Datentypen:DB2 hat viele weitere Standardtypen, wie zum Beispiel SMALLINT , INTEGER , DOUBLE usw. Diese sind in Oracle SQL nicht vorhanden (obwohl einige in PL/SQL vorhanden sind). Dies ist wichtig für DDL und für das Casting und einige andere Anwendungsfälle, wie z. B. die Korrektheit von Prädikaten
  • Datumsdatentypen:Oracles einziger Unterschied zwischen DATE und TIMESTAMP ist die Tatsache, dass TIMESTAMP hat Mikrosekunden. Aber DATE kann auch Zeitinformationen enthalten. In DB2 DATE hat keine Zeitangabe, glaube ich.
  • Zeichendatentypen:Lesen Sie mehr über den Unterschied zwischen VARCHAR und VARCHAR2 in Oracle
  • NULL . In Oracle NULL ist viel allgemeiner als in DB2. Vor DB2 v9.7 mussten Sie NULL umwandeln zu jedem expliziten Typ, z. cast(null as integer) . Das ist in Oracle nicht nötig.

Systemobjekte

  • SYSIBM.DUAL wird einfach zu DUAL
  • Funktionen:Sie sind alle ein bisschen anders. Musst du im Einzelfall prüfen. Beispiel:LOCATE wird zu INSTR

Syntax

  • TRUNCATE IMMEDIATE wird zu TRUNCATE
  • EXCEPT wird zu MINUS
  • DB2's FETCH FIRST n ROWS ONLY :Es gibt keine solche Klausel in Oracle. Sie müssen ROWNUM verwenden oder ROW_NUMBER() OVER() Filtern (siehe dieses Beispiel ). )
  • DB2s MERGE -Anweisung ist leistungsfähiger als die von Oracle, falls Sie diese verwenden.
  • DB2 unterstützt INSERT INTO .. (..) VALUES (..), (..), (..) . Bei Oracle müssten Sie INSERT INTO .. SELECT .. UNION ALL SELECT .. UNION ALL SELECT .. schreiben

Erweitert

  • Wenn Sie gespeicherte Prozeduren verwenden, funktionieren sie etwas anders, insbesondere bei fortgeschrittenen Datentypen, aber das geht hier nicht in den Rahmen.

Der effizienteste Versuch, dies zu erreichen, besteht möglicherweise darin, eine Art SQL-Abstraktion zu verwenden. Wenn Sie Java verwenden, würde ich empfehlen, dass Sie Ihre SQL-Anweisungen mit jOOQ umschließen (Disclaimer:Ich arbeite für das Unternehmen hinter jOOQ). jOOQ bietet eine Abstraktion auf API-Ebene für alle oben genannten Fakten. Sehr viel SQL kann ohne Anpassung sowohl auf DB2 als auch auf Oracle ausgeführt werden. Wir arbeiten auch an einem unabhängigeren Übersetzerprodukt:https://www.jooq.org/translate

Auf einer höheren Abstraktionsebene Hibernate (oder andere JPA-Implementierungen) können dasselbe für Sie tun