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

PostgreSQL Discussion :

Requête oracle vers postgres


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 68
    Par défaut Requête oracle vers postgres
    Bonjour j'ai deux requêtes qui passaient en oracle et qui ne passe plus en postgres :

    Requête 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select to_char(s.date_synchro, 'YYYY') as annee, 
    to_char(s.date_synchro, 'MM') as mois_chiffre, 
    to_char(s.date_synchro, 'MONTH') as mois, 
    to_char(s.date_synchro, 'WW') as semaine,
    substr('t.Date_Synchro', 0, 10) as date_synchro, 
    t.nb_appli_tmp as nb_applis,
    s.nb_job_tmp as nb_jobs
    from stat_applis t, STAT_JOBS s
    where substr(t.Date_Synchro ,0 ,10) SIMILAR TO substr(s.Date_Synchro ,0 ,10)
    and s.ID_DOMAINE = t.ID_DOMAINE and s.ID_DOMAINE = 1
    and to_char(s.date_synchro, 'DAY') like '%LUNDI%'
    order by annee desc,semaine desc
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    l'erreur vient de substr a priori mais je ne vois pas pourquoi quand je regarde dans le manuel postgres, j'ai bien cette option présente avec la même synthaxe.

    Requête 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select e.environnement,a.application,(((LENGTH(a.liens_vers) - LENGTH(REPLACE(a.liens_vers, ',')))/ LENGTH(',')) + 1) AS nb_liens_applis,j.job,(((LENGTH(j.liens_vers) - LENGTH(REPLACE(j.liens_vers, ',')))/ LENGTH(',')) + 1) AS nb_liens_jobs 
    from t_environnement e,t_application a, t_job j
    where e.id_environnement_ora = a.id_environnement_ora
    and j.id_application_ora = a.id_application_ora
    and j.id_domaine = 1
    and j.machine not like '%poub%'
    order by e.environnement,a.application,j.job
    message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERROR:  function replace(character varying, unknown) does not exist
    LINE 1: ...nt,a.application,(((LENGTH(a.liens_vers) - LENGTH(REPLACE(a....
                                                                 ^
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    idem, la fonction replace existe aussi en postgres, je ne vois pas pourquoi cela ne colle pas.

  2. #2
    Membre expérimenté
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Par défaut
    Bonjour,
    ayant eu à passer une base ORACLE (9) en Postgresql (8.4), je sais par expérience que c'est un travail fastidieux. J'avais utilisé ora2pg sous linux mais j'ai du reprendre de nombreuses requêtes à la mano.
    Je ne te parle même pas des centaines de requêtes dans tous les codes sources qu'il a fallu contrôler et modifier.
    Il faut que tu vérifies dans un 1er temps l'existence de toute les fonctions que tu utilises dans tes requêtes ORACLE et trouver leur équivalent sous PG.
    par exemple :
    ORA : substr PG : substring
    ORA : to_date PG : to_timestamp
    ORA : lenght PG : char_lenght
    etc
    Je te conseille de prendre la doc postgresql pour connaitre la liste et la synthaxe des fonctions. Certaines portent peut être le même nom, mais pas sur qu'elles fassent pareil...
    c'est le combat que tu ne peux pas éviter lors de la traduction des requêtes entre différentes BDD.
    C'est pas pour aujourd'hui qu'ils se mettront d'accord pour normaliser tout ça!
    attention au versionnage : https://postgresql.developpez.com/do...tion/francais/
    Bon courage.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    vous n'indiquez pas votre version de pgsql.

    ceci étant dit en faisant un petit test (en 9.1) :

    Cas 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select substr('2012-02-15'::date, 1, 4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ERREUR:  la fonction substr(date, integer, integer) n'existe pas
    LINE 1: select substr('2012-02-15'::date, 1, 4)
                   ^
    HINT:  Aucune fonction ne correspond au nom donné et aux types d'arguments.
    Vous devez ajouter des conversions explicites de type.
    Ce qui est logique vu que substr veut un text ou bytea en entrée et non une date.


    Pour le cas 2 :
    Replace prend 3 arguments et non 2.

    rebouclez avec la doc !

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Effectivement les différents substr(date ou timestamp,0 ,10) seraient avantageusement remplacés par to_char(date, 'YYYY-MM-DD').

    Par ailleurs dans la clause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substr('t.Date_Synchro', 0, 10) AS date_synchro,
    la présence des apostrophes est visiblement une erreur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 68
    Par défaut
    Merci pour vos réponses, je vais tester.
    Je suis en postgres 8.3

Discussions similaires

  1. PL SQL oracle vers postgres
    Par nathieb dans le forum Requêtes
    Réponses: 8
    Dernier message: 24/06/2013, 19h22
  2. Problème de conversion d'une requête Oracle vers SQL serveur
    Par sono77 dans le forum Développement
    Réponses: 1
    Dernier message: 01/02/2012, 14h50
  3. Traduire requête oracle vers access
    Par petitmic dans le forum Access
    Réponses: 1
    Dernier message: 27/09/2005, 18h21
  4. [PostGre] Migration de Oracle 8i vers PostGre ?
    Par delphim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 21/04/2004, 17h04
  5. Tranfert de données d'une base Oracle vers PostGre
    Par Elois dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/01/2004, 18h08

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