IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Passage de Oracle à Postgre


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 77
    Points
    77
    Par défaut Passage de Oracle à Postgre
    Bonjour, dans le cadre d'une migration, je dois modifier quelques requêtes écrites pour oracle afin qu'elle puisse être mangée par Postgre.

    Au départ, j'ai :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    create view TSTVIEW 
    as 
    select a.*,
           b.met_id,b.met_lib,
           h.fct_id,
           c.fct_lib,
           d.ct_id,d.ct_lib,j.ct_valide,
           e.typ_id,e.typ_lib,
           f.notfct_val,
           i.ser_lib  
    from 
        collaborateurs a,
        metiers b,
        fonction c,
        competences_tech d,
        type_ct e,
        li_col_ct_fct f,
        li_col_met g,
        li_col_fct h,
        service i,
        LI_MET_TYP_CT j
    where 
        (a.col_id=g.col_id(+) 
        and g.met_id=b.met_id(+)) 
        and (a.col_id=h.col_id(+) 
        and h.fct_id=c.fct_id(+)) 
        and (f.col_id=a.col_id and f.met_id=b.met_id and d.ct_id=f.ct_id) 
        and (j.typ_id=e.typ_id) 
        and (a.ser_id = i.ser_id(+)) 
        and (j.ct_id = d.ct_id)
        and (j.met_id = g.met_id)
    order by a.col_nom asc , c.fct_lib asc , e.typ_lib asc , j.ct_valide desc, d.ct_lib asc;
    En appliquant ce que j'ai compris de cet opérateur, j'ai transformé le code en



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE OR REPLACE VIEW tstview AS 
     SELECT a.col_id, a.col_matricule, a.col_nom, a.col_prenom, a.col_dt_entree, a.col_qual,
     a.col_formation, a.ser_id, a.ag_id, a.col_typeimport, a.col_dt_naiss, a.col_int_ext, a.col_sexe,
     a.col_nomabrege, a.col_diplome, a.col_pr_semicomplet,
     a.col_pr_complet, b.met_id, b.met_lib, h.fct_id, c.fct_lib, d.ct_id, d.ct_lib, j.ct_valide, e.typ_id, e.typ_lib, f.notfct_val, i.ser_lib
       FROM collaborateurs a
       LEFT JOIN li_col_met g ON a.col_id = g.col_id
       LEFT JOIN li_col_fct h ON a.col_id = h.col_id
       LEFT JOIN service i ON a.ser_id = i.ser_id, competences_tech d, type_ct e, li_col_ct_fct f, li_col_met
       LEFT JOIN metiers b ON li_col_met.met_id = b.met_id, li_col_fct
       LEFT JOIN fonction c ON li_col_fct.fct_id = c.fct_id, li_met_typ_ct j
      WHERE f.col_id = a.col_id AND f.met_id = b.met_id AND d.ct_id = f.ct_id AND j.typ_id = e.typ_id AND j.ct_id = d.ct_id AND j.met_id = g.met_id
      ORDER BY a.col_nom, c.fct_lib, e.typ_lib, j.ct_valide DESC, d.ct_lib;
     
    ALTER TABLE tstview OWNER TO postgres;
    La syntaxe est résultat de ce postgreSQL a retraité à partir de mon code modifié.

    Je suppose que ma requête est sémantiquement différente de la première car sous oracle, j'ai qq chose et pas sous Postgre alors que j'ai les même données.

    Des paires d'yeux averties verraient-elles quelque chose ?

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    as-tu testé la même requête sous oracle ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Fred_D
    as-tu testé la même requête sous oracle ?
    Pourquoi n'y ai-je pas pensé plus tôt ?...

    J'ai donc adapté ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SELECT 
    collaborateurs.col_id,
    collaborateurs.col_matricule,
    collaborateurs.col_nom,
    collaborateurs.col_prenom,
    collaborateurs.col_dt_entree, 
    Collaborateurs.col_qual,
    collaborateurs.col_formation,
    collaborateurs.ser_id, 
    Collaborateurs.ag_id,
    collaborateurs.col_typeimport, 
    collaborateurs.col_dt_naiss, 
    collaborateurs.col_int_ext, 
    collaborateurs.col_sexe, 
    collaborateurs.col_nomabrege, 
    collaborateurs.col_diplome, 
    collaborateurs.col_pr_semicomplet,
    collaborateurs.col_pr_complet,
    metiers.met_id,
    metiers.met_lib,
    li_col_fct.fct_id,
    fonction.fct_lib, 
    d.ct_id, 
    d.ct_lib, 
    j.ct_valide,
    e.typ_id, 
    e.typ_lib, 
    f.notfct_val,
    service.ser_lib
    FROM
    collaborateurs  FULL   OUTER JOIN li_col_met ON (collaborateurs.col_id = li_col_met.col_id)
    FULL   OUTER JOIN li_col_fct  ON (collaborateurs.col_id = li_col_fct.col_id)
    FULL   OUTER JOIN service  ON (collaborateurs.ser_id = service.ser_id),
    competences_tech d, 
    type_ct e,
    li_col_ct_fct f,
    li_col_met FULL   OUTER JOIN metiers ON (li_col_met.met_id = metiers.met_id),
    li_col_fct FULL   OUTER JOIN fonction  ON (li_col_fct.fct_id = fonction.fct_id),
    li_met_typ_ct j
    WHERE 
    f.col_id = collaborateurs.col_id AND
    f.met_id = metiers.met_id AND 
    d.ct_id = f.ct_id AND
    j.typ_id = e.typ_id AND
    j.ct_id = d.ct_id AND
    j.met_id = li_col_met.met_id
    ORDER BY collaborateurs.col_nom, 
    fonction.fct_lib,
    e.typ_lib,
    j.ct_valide DESC, 
    d.ct_lib;
    Oracle n'en veut pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    SQL> SELECT 
      2  collaborateurs.col_id,
      3  collaborateurs.col_matricule,
      4  collaborateurs.col_nom,
      5  collaborateurs.col_prenom,
      6  collaborateurs.col_dt_entree, 
      7  Collaborateurs.col_qual,
      8  collaborateurs.col_formation,
      9  collaborateurs.ser_id, 
     10  Collaborateurs.ag_id,
    11  collaborateurs.col_typeimport, 
    12  collaborateurs.col_dt_naiss, 
    13  collaborateurs.col_int_ext, 
    14  collaborateurs.col_sexe, 
    15  collaborateurs.col_nomabrege, 
    16  collaborateurs.col_diplome, 
    17  collaborateurs.col_pr_semicomplet,
    18  collaborateurs.col_pr_complet,
    19  metiers.met_id,
    20  metiers.met_lib,
    21  li_col_fct.fct_id,
    22  fonction.fct_lib, 
    23  d.ct_id, 
    24  d.ct_lib, 
    25  j.ct_valide,
    26  e.typ_id, 
    27  e.typ_lib, 
    28  f.notfct_val,
    29  service.ser_lib
    30  FROM
    31  collaborateurs  FULL OUTER JOIN li_col_met ON (collaborateurs.col_id = li_col_met.col_id)
    32  FULL OUTER JOIN li_col_fct  ON (collaborateurs.col_id = li_col_fct.col_id)
    33  FULL OUTER JOIN service  ON (collaborateurs.ser_id = service.ser_id),
    34  competences_tech d, 
    35  type_ct e,
    36  li_col_ct_fct f,
    37  li_col_met FULL OUTER JOIN metiers ON (li_col_met.met_id = metiers.met_id),
    38  li_col_fct FULL OUTER JOIN fonction  ON (li_col_fct.fct_id = fonction.fct_id),
    39  li_met_typ_ct j
    40  WHERE 
    41  f.col_id = collaborateurs.col_id AND
    42  f.met_id = metiers.met_id AND 
    43  d.ct_id = f.ct_id AND
    44  j.typ_id = e.typ_id AND
    45  j.ct_id = d.ct_id AND
    46  j.met_id = li_col_met.met_id
    47  ORDER BY collaborateurs.col_nom, 
    48  fonction.fct_lib,
    49  e.typ_lib,
    50  j.ct_valide DESC, 
    51  d.ct_lib;
    ollaborateurs  FULL OUTER JOIN li_col_met ON (collaborateurs.col_id = li_col_met.col_id)
                        *
    RREUR à la ligne 31 :
    RA-00933: La commande SQL ne se termine pas correctement
    J'ai aussi essayé en séparant les jointures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    SQL> SELECT 
      2  collaborateurs.col_id,
      3  collaborateurs.col_matricule,
      4  collaborateurs.col_nom,
      5  collaborateurs.col_prenom,
      6  collaborateurs.col_dt_entree, 
      7  Collaborateurs.col_qual,
      8  collaborateurs.col_formation,
      9  collaborateurs.ser_id, 
     10  Collaborateurs.ag_id,
    11  collaborateurs.col_typeimport, 
    12  collaborateurs.col_dt_naiss, 
    13  collaborateurs.col_int_ext, 
    14  collaborateurs.col_sexe, 
    15  collaborateurs.col_nomabrege, 
    16  collaborateurs.col_diplome, 
    17  collaborateurs.col_pr_semicomplet,
    18  collaborateurs.col_pr_complet,
    19  metiers.met_id,
    20  metiers.met_lib,
    21  li_col_fct.fct_id,
    22  fonction.fct_lib, 
    23  d.ct_id, 
    24  d.ct_lib, 
    25  j.ct_valide,
    26  e.typ_id, 
    27  e.typ_lib, 
    28  f.notfct_val,
    29  service.ser_lib
    30  FROM
    31  collaborateurs  FULL OUTER JOIN li_col_met ON (collaborateurs.col_id = li_col_met.col_id),
    32  collaborateurs FULL OUTER JOIN li_col_fct  ON (collaborateurs.col_id = li_col_fct.col_id),
    33  collaborateurs  FULL OUTER JOIN service  ON (collaborateurs.ser_id = service.ser_id),
    34  competences_tech d, 
    35  type_ct e,
    36  li_col_ct_fct f,
    37  li_col_met FULL OUTER JOIN metiers ON (li_col_met.met_id = metiers.met_id),
    38  li_col_fct FULL OUTER JOIN fonction  ON (li_col_fct.fct_id = fonction.fct_id),
    39  li_met_typ_ct j
    40  WHERE 
    41  f.col_id = collaborateurs.col_id AND
    42  f.met_id = metiers.met_id AND 
    43  d.ct_id = f.ct_id AND
    44  j.typ_id = e.typ_id AND
    45  j.ct_id = d.ct_id AND
    46  j.met_id = li_col_met.met_id
    47  ORDER BY collaborateurs.col_nom, 
    48  fonction.fct_lib,
    49  e.typ_lib,
    50  j.ct_valide DESC, 
    51  d.ct_lib;
    ollaborateurs  FULL OUTER JOIN li_col_met ON (collaborateurs.col_id = li_col_met.col_id),
                        *
    RREUR à la ligne 31 :
    RA-00933: La commande SQL ne se termine pas correctement
    J'ai bien vérifié que les schéma (nom de table, de champs) sont valides (de toutes façon, il s'agit d'une réplication automatique) ainsi que la syntaxe.

    Là je comprend pas...

    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    la norme ANSI est implémentée depuis la 9i il me semble

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Fred_D
    la norme ANSI est implémentée depuis la 9i il me semble
    Il s'agit effectivement d'une 8.1

    Cela vient de ça ? Les LEFT|RIGHT|FULL JOIN ne sont pas implémentés sur Oracle 8.x ?

  6. #6
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Je confirme, pas implémenté en 8.1.7.0.0, je viens de tester.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 77
    Points
    77
    Par défaut Schéma cyclique
    Quand je fais le schéma de cette requête (que je n'ai pas écrite à la base), j'ai l'impression que le graphe est cyclique, ce qui expliquerai pourquoi postgre plante dessus au bout de 10 minutes.

Discussions similaires

  1. PB Passage d'une BD Oracle à PostGRE SQL
    Par wendpagna dans le forum Hibernate
    Réponses: 5
    Dernier message: 09/03/2009, 10h35
  2. SQL SERVER 2005 - Passage de Oracle à Sql server
    Par cvermtw dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/02/2008, 17h30
  3. Réponses: 3
    Dernier message: 04/10/2007, 15h43
  4. le passage Exel -> oracle
    Par youness_ka dans le forum SQL
    Réponses: 3
    Dernier message: 23/07/2007, 00h40
  5. Oracle -> Postgres (avantages/ inconvénients)
    Par milka dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 12/03/2004, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo