Vous n'êtes pas identifié(e).

#2 Re : Général » Double compatibilité PostGreSQL / Oracle » 14/01/2019 18:39:26

Merci : la solution avec le WITH récursif fonctionne effectivement, à quelques nuances près (en gras) :

Avec les données suivantes :
CREATE TABLE ARBORESCENCE(    
  ID VARCHAR(25),
    PERE_ID VARCHAR(25),
    REFERENCE VARCHAR(80),
    INTITULE VARCHAR(200));
INSERT INTO ARBORESCENCE (ID, PERE_ID, REFERENCE, INTITULE) VALUES ('1', null, '1', 'père');
INSERT INTO ARBORESCENCE (ID, PERE_ID, REFERENCE, INTITULE) VALUES ('11', '1', '11', 'fils 1');
INSERT INTO ARBORESCENCE (ID, PERE_ID, REFERENCE, INTITULE) VALUES ('12', '1', '12', 'fils 2');
INSERT INTO ARBORESCENCE (ID, PERE_ID, REFERENCE, INTITULE) VALUES ('111', '11', '111', 'petit-fils 1, fils de 11');
INSERT INTO ARBORESCENCE (ID, PERE_ID, REFERENCE, INTITULE) VALUES ('112', '11', '112', 'petit-fils 2, fils de 11');
INSERT INTO ARBORESCENCE (ID, PERE_ID, REFERENCE, INTITULE) VALUES ('121', '12', '121', 'petit-fils 1, fils de 12');


Sous PostGre :

WITH RECURSIVE ARBORENCE_RECURSIVE(ID, PERE_ID, REFERENCE, INTITULE, PROFONDEUR, CHEMIN) AS (
        SELECT A.ID, A.PERE_ID, A.REFERENCE, A.INTITULE, 1, CAST(A.ID AS TEXT)
        FROM ARBORESCENCE A
    WHERE PERE_ID IS NULL
    UNION ALL
        SELECT FILS.ID, FILS.PERE_ID, FILS.REFERENCE, FILS.INTITULE, PERE.PROFONDEUR + 1, PERE.CHEMIN || '/' || FILS.ID
        FROM ARBORESCENCE FILS, ARBORENCE_RECURSIVE PERE
        WHERE FILS.PERE_ID = PERE.ID
     )
SELECT * FROM ARBORENCE_RECURSIVE;



Sous Oracle :

WITH ARBORENCE_RECURSIVE(ID, PERE_ID, REFERENCE, INTITULE, PROFONDEUR, CHEMIN) AS (
        SELECT A.ID, A.PERE_ID, A.REFERENCE, A.INTITULE, 1, A.ID
        FROM ARBORESCENCE A
    WHERE PERE_ID IS NULL
    UNION ALL
        SELECT FILS.ID, FILS.PERE_ID, FILS.REFERENCE, FILS.INTITULE, PERE.PROFONDEUR + 1, PERE.CHEMIN || '/' || FILS.ID
        FROM ARBORESCENCE FILS, ARBORENCE_RECURSIVE PERE
        WHERE FILS.PERE_ID = PERE.ID
     )
SELECT * FROM ARBORENCE_RECURSIVE;



Dans les 2 cas, le résultat est :

"ID"                          "PERE_ID"               "REFERENCE"            "INTITULE"                  "PROFONDEUR"         "CHEMIN"                     
"1"                           ""                            "1"                           "père"                         "1"                           "1"                           
"11"                          "1"                          "11"                         "fils 1"                         "2"                           "1/11"                       
"12"                          "1"                          "12"                         "fils 2"                         "2"                           "1/12"                       
"111"                         "11"                        "111"                       "petit-fils 1, fils de 11"  "3"                           "1/11/111"                   
"112"                         "11"                        "112"                       "petit-fils 2, fils de 11"  "3"                           "1/11/112"                   
"121"                         "12"                        "121"                       "petit-fils 1, fils de 12"  "3"                           "1/12/121"

#3 Général » Double compatibilité PostGreSQL / Oracle » 04/01/2019 17:22:52

Benjamin
Réponses : 4

Bonjour,


Je travaille pour un éditeur dont le logiciel est installé sur site chez ses clients.
Chaque installation repose sur :

- une application java, avec une couche d'ORM qui inclue des requêtes SQL, exécuté via une librairie JDBC

- une BDD Oracle propre à l'installation, accédée via JDBC par l'application java

Il n'y a pas de PL/SQL.


J'étudie la faisabilité de rendre la couche ORM de l'application java compatible avec PostGreSQL.
Un des scénario étudié serait d'avoir une couche ORM qui soit à la fois compatible PostGreSQL et Oracle.


Or la norme SQL, supportée à la fois par PostGreSQL et Oracle, ne semble pas suffisante pour couvrir toutes les fonctionnalités.


Par exemple pour faire des requêtes sur une arborescence d'objet :

- Avec Oracle :
   SELECT ...
   FROM ...
   START WITH ...
   CONNECT BY PRIOR ...
- Avec PostGre :
  WITH RECURSIVE tree (...) AS (
    SELECT ...
    FROM ...
  UNION ALL
    SELECT ...
    FROM ...
    WHERE ...
  )
  SELECT ... FROM tree;


Mais pas de syntaxe standard qui soit interprétable pour les 2 BDD semble-t-il.

Quelqu'un a-t-il une expérience / une expertise pour un projet qui consisterait à rendre une application à la fois compatible PostGreSQL et Oracle ?

Pied de page des forums

Propulsé par FluxBB