Conversion mysql vers oracle

Conversion mysql vers oracle - SQL/NoSQL - Programmation

Marsh Posté le 12-08-2004 à 11:03:03    

Bon voila je manipule une base de donnes Mysql (avec php)et dans le cadre de la mise en production du prog je vais sans doute devoir passer sur oracle .
Quelqu un connaitrait un site recapitulant les differences (fonctions equivalentes , etc ..) ?

Reply

Marsh Posté le 12-08-2004 à 11:03:03   

Reply

Marsh Posté le 12-08-2004 à 12:16:17    

c'est probablement plus simple dans ce sens là que dans l'autre en ce qui concerne les requêtes SQL, car Oracle est plus complet que mySql (requêtes imbriquées, etc.).

Reply

Marsh Posté le 12-08-2004 à 16:08:41    

Le seul TRES gros souci, c'est qu'Oracle ne supporte pas le LIMIT.
 
Donc partout où tu en a mis un, tu vas t'amuser...
Tu peux toujours utiliser cette fonction PHP :
db_query_limit($query,$id_connexion,$debut,$fin)
 
Sinon, il y a une requête un peu complexe à écrire avec Oracle, et ça permet d'émuler un LIMIT n,m
 
Sinon, j'ai parcouris très rapidement ce site, je pense qu'il te sera utile :
http://didier.deleglise.free.fr/php/mysql_oracle.htm

Reply

Marsh Posté le 12-08-2004 à 16:37:30    

en même temps, il doit pas y avoir beaucoup d'utilisation d'un LIMIT n,m sous mySql ...
 
et si y a de telle requêtes, on peut aussi le faire en Oracle, avec des ORDER BY et ROWNUM ...

Reply

Marsh Posté le 12-08-2004 à 16:42:21    

ouais, mais la syntaxe est beaucoup plus lourde sous Oracle. C'est pour moi le point le plus bloquant.
 
PS: Les LIMIT n,m tu en as dès que tu fait de l'affichage d'une liste sur plusieurs pages (catalogue, moteur de recherche, etc.) un certains sites peuvent au contraire en avoir énormément.

Reply

Marsh Posté le 12-08-2004 à 17:01:30    

c'est un des seuls cas où la syntaxe Oracle est plus lourde que celle de mySql ... donc ok, c'est lourd, mais il suffit de le faire une fois, et c'est pas si dur à écrire :D
 
par contre, les requête imbriquées, le bonheur :)

Reply

Marsh Posté le 12-08-2004 à 17:26:59    

On peut faire quelquechose comme ça par exemple sous Oracle, pour le LIMIT :
 

Code :
  1. select customer_ref, rn from
  2.     (select customer_ref, rownum rn from
  3.         (select * from customer order by customer_ref
  4.         )
  5.     )
  6. where rn > 10
  7. and rn < 20;

Reply

Marsh Posté le 12-08-2004 à 18:17:23    

Beegee a écrit :

c'est un des seuls cas où la syntaxe Oracle est plus lourde que celle de mySql ... donc ok, c'est lourd, mais il suffit de le faire une fois, et c'est pas si dur à écrire :D
 
par contre, les requête imbriquées, le bonheur :)


 
Mais c'est pour ça que je la cite, parceque je pense que c'est le seul vrai truc emmerdant, pour le reste, pas de problème particulier.

Reply

Marsh Posté le 12-08-2004 à 18:19:31    

Beegee a écrit :

On peut faire quelquechose comme ça par exemple sous Oracle, pour le LIMIT :
 

Code :
  1. select customer_ref, rn from
  2.     (select customer_ref, rownum rn from
  3.         (select * from customer order by customer_ref
  4.         )
  5.     )
  6. where rn > 10
  7. and rn < 20;



Je pense qu'il vaut mieu utiliser la foncton PHP. En effet, niveau perfs, le curseurs devrait rester côté serveur si la fonction est bien écrite, donc ça change pas grand chose, et surtout, ça évide de changer les requêtes (juste virer le limit). C'est donc moins contraignant pour la maintenance.

Reply

Marsh Posté le 12-08-2004 à 18:22:12    

PS: where rn > 10 ne retournera jamais de ligne.
En effet, rownum correspond au numéro de la ligne RETOURNEE, donc si tu vires la 1, la suivante prends la valeur 1 et ainsi de suite : aucune ligne ne passe.
 
Il faut donc faire ça :
 


select fields from (select fields, rn from  
      (select fields, rownum rn from  
          (select fields from customer order by customer_ref order by fields) where rn < 20 order by fields desc
      ) where rn > 10) order by fields


 
Ce qui est légèrement plus lourds ;)

Reply

Marsh Posté le 12-08-2004 à 18:22:12   

Reply

Marsh Posté le 13-08-2004 à 01:14:44    

Si, le rn > 10 marche dans ce cas précis, car on fait stoquer les valeurs de rownum de la sous-requête ;)
=> testé et approuvé ;)
 
Ce qui ne marche pas c'est de faire un rownum > 10 directement :)

Reply

Marsh Posté le 13-08-2004 à 03:26:30    

ha oui en effet :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed