Oracle
 sql >> Base de données >  >> RDS >> Oracle

conversion d'une requête DB2 en requête oracle

Vous avez beaucoup de travail devant vous !

Entre DB2 et Oracle, certaines différences importantes sont (juste une énumération arbitraire de ce à quoi je peux penser) :

Types de données

  • Types de données numériques :DB2 a beaucoup plus de types standard, tels que SMALLINT , INTEGER , DOUBLE , etc. Ceux-ci n'existent pas dans Oracle SQL (bien que certains existent dans PL/SQL). Ceci est important pour DDL et pour la diffusion et certains autres cas d'utilisation, tels que l'exactitude des prédicats
  • Types de données de date :la seule différence d'Oracle entre DATE et TIMESTAMP est le fait que TIMESTAMP a des microsecondes. Mais DATE peut également contenir des informations temporelles. Dans DB2, DATE n'a pas d'informations sur l'heure, je pense.
  • Types de données de caractères :découvrez la différence entre VARCHAR et VARCHAR2 dans Oracle
  • NULL . Dans Oracle, NULL est beaucoup plus général que dans DB2. Avant DB2 v9.7, vous deviez caster NULL à n'importe quel type explicite, par ex. cast(null as integer) . Ce n'est pas nécessaire dans Oracle.

Objets système

  • SYSIBM.DUAL devient simplement DUAL
  • Fonctions :elles sont toutes un peu différentes. Il faudra vérifier au cas par cas. Par exemple, LOCATE devient INSTR

Syntaxe

  • TRUNCATE IMMEDIATE devient TRUNCATE
  • EXCEPT devient MINUS
  • DB2's FETCH FIRST n ROWS ONLY :Il n'y a pas une telle clause dans Oracle. Vous devrez utiliser ROWNUM ou ROW_NUMBER() OVER() filtrage (voir cet exemple )
  • MERGE de DB2 instruction est plus puissante que celle d'Oracle, au cas où vous l'utiliseriez.
  • DB2 prend en charge INSERT INTO .. (..) VALUES (..), (..), (..) . Avec Oracle, il faudrait écrire INSERT INTO .. SELECT .. UNION ALL SELECT .. UNION ALL SELECT ..

Avancé

  • Si vous utilisez des procédures stockées, elles fonctionnent un peu différemment, en particulier avec les types de données avancés impliqués, mais cela sort du cadre ici.

Votre coup le plus efficace pour cela pourrait être d'utiliser une sorte d'abstraction SQL. Si vous utilisez Java, je vous recommande d'envelopper vos instructions SQL avec jOOQ (Avertissement :je travaille pour l'entreprise derrière jOOQ). jOOQ fournit une abstraction au niveau de l'API pour tous les faits ci-dessus. Une grande partie de SQL peut être exécutée à la fois sur DB2 et Oracle, sans adaptation. Nous travaillons également sur un produit de traduction plus indépendant :https://www.jooq.org/translate

À un niveau d'abstraction supérieur, Hibernate (ou d'autres implémentations JPA) peuvent faire la même chose pour vous