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 :

Migration procédures stockées : Oracle vers Postgresql


Sujet :

PostgreSQL

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Par défaut Migration procédures stockées : Oracle vers Postgresql
    Bonjour,

    je travaille actuellement sur une migration de base de données Oracle vers Postgresql dans le cadre d'une application Java-GWT.
    Un problème me bloque sur les procédures stockées :

    - j'ai des procédures créées de la sorte : CREATE OR REPLACE FUNCTION schema.nomProcedure(OUT code text, OUT erreur text, IN numero text).
    Le code SQL de la procédure affiche à la fin : ALTER FUNCTION schema.nomProcedure(text)
    Seul les paramètres IN comptent alors.

    - puisque je suis en Java, je les appelle depuis le pool de connexion JDBC.
    Le problème est que cela génère l'erreur suivante :
    org.postgresql.util.PSQLException: ERREUR: la fonction schema.nomProcedure(text, text, text) n'existe pas
    [java] Indice?: Aucune fonction ne correspond au nom donn? et aux types d'arguments.
    [java] Vous devez ajouter des conversions explicites de type.

    Cela signifie alors que les paramètres OUT ne doivent pas être mentionnés dans l'appel = > SELECT schema.nomProcedure('2'); /* ?????? */
    Cette solution génère une erreur également.


    Au final, je ne parviens pas à appeler les procédures stockées possédant des paramètres OUT. J'ai 378 procédures, avec des dépendances entre procédures.
    Faut-il supprimer tous les paramètres OUT ? Les remplacer par du IN ? Les remplacer par ni IN ni OUT ?

    N.B : le INOUT ne fonctionne pas non plus.

    Merci.

  2. #2
    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,


    un exemple simple en SQL uniquemenent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE FUNCTION fct(IN val1 integer, OUT val2 integer)
      RETURNS integer AS
    $BODY$
    begin
    	val2 := val1 + 2;
    end$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    Appel de la fonction :
    [code]
    select fct(3)
    [code]

    Retour de la fonction (c'est un record)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fct integer
    ----------------
    5

    Maintenant avec plusieur parametre regardez les exemples de la doc : http://www.postgresql.org/docs/9.3/s...efunction.html

  3. #3
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    il me semble bien que l'ordre des paramètres quand tu as des in et out est important...

    sinon les out vont juste te créer un record si tu en as plusieurs, comme si tu avais fait un:
    ou sur un type équivalant...
    en gros, dés que tu introduis un out tu peux plus avoir de in après.

    méfie toi des règles d'emploi de return dans le corps de la fonction aussi...

    à savoir que tu es obligé de typer ta sortie si tu veux utiliser ta fonction dans un from ou une jointure comme une table... en effet, un type est automatiquement générer quand tu crée une table.

    pour les pures procédures (sans retour), tu peux utiliser la commande procédurale perform. sinon c'est forcément ce que t'as montré punkoff avec un simple select.

    Niveau performances, pense à faire des fonctions sql quand tu peux résumer ton action (dans la fonction) à une unique requête sql sinon ce sera évidemment du pgsql.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Par défaut Plusieurs paramètres OUT
    Merci pour ces conseils, cela m'a bien aidé !

    J'ai enlevé les paramètres OUT lors d'un appel de procédure. Comme l'exemple de punkoff.

    Néanmoins, j'ai besoin des paramètres OUT. Si je ne les mentionne pas, cela me crée une erreur.
    Donc en les mentionnant les appels ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     select fct(3) INTO val2, val3
    Car j'ai plusieurs paramètres OUT à récupérer : val2 et val3. Tout deux des chaîne de caractères.
    Le problème c'est que j'ai toutes les valeurs dans val2, val3 reste NULL.
    val2 vaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ('bb', 'une chaine de caractère')
    Et val3 :
    En fait, val2 vaut 'bb', et val3 vaut 'une chaine de caractère' mais tout se met dans la première variable OUT.

    Comment faire alors pour récupérer les deux variables séparément l'une de l'autre ?

    J'ai vu que split_part(string text, delimiter text, field int) existe mais ce n'est pas trop "beau" comme solution, malheureusement .

  5. #5
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Citation Envoyé par vingohan Voir le message

    - j'ai des procédures créées de la sorte : CREATE OR REPLACE FUNCTION schema.nomProcedure(OUT code text, OUT erreur text, IN numero text).
    Le code SQL de la procédure affiche à la fin : ALTER FUNCTION schema.nomProcedure(text)
    Seul les paramètres IN comptent alors.
    Un serpent qui se mord la queue ou
    Au finish, peux-tu donner la DLL d'une procédure telle qu'elle est dans PostgreSQL?
    @+

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create type t_fct as (ret1 int, ret2 int);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    drop function fct(val1 integer);
     
    create function fct(val1 integer) returns t_fct as $$
    declare result t_fct;
    begin
    select val1 +2 as ret1, val1 + 3 as ret2 into result;
    return result;
    end;
    $$language plpgsql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from fct(3) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ---------------------
    5          6

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Par défaut
    Le problème c'est que ce n'est pas des integer mais des chaînes de caractères, le type text.

    Comment faire alors pour récupérer les deux variables séparément l'une de l'autre qui sont pourtant dans la première variable val2 ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT fct(3) INTO val2, val3

  8. #8
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    c'est en effet le moyen en procédural...

    un dernier truc postgreSQL est super pointilleux sur les types, il ne fait jamais de conversion implicite !! par exemple, il ne convertira jamais un smallint en int ou bigint ou inversement... il faut forcer la conversion !

    à noter que le type dépend du schéma donc n'oublie pas de mettre le schéma devant surtout si tu as des appel à des fonctions entre schémas.

    de manière générale, moi je mets toujours les noms de schéma devant les objets dans le code...

    niveau droits, je te conseille security definer, ce qui permet d'appeler tes fonctions avec un utilisateur qui a des droits limités (select et execute) et d'être capable d'exécuter l'intérieur de ta fonction avec les droits de celui qui l'a créée.

    je pense qu'avec ça tu devrais avoir le principal...

  9. #9
    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
    nan mais là il va falloir un minimum comprendre les exemples posés et la manière dont ils sont appelés sinon c'est pas la peine.


    ------
    edit :

    il y a une différence entre :
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from fct(3)

  10. #10
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    craque pas punkoff

    bon soyons plus explicite...

    quand tu renvoies un record ou un type nommé équivalant, tu n'as donc qu'un seule variable en sortie...

    mais cette variable contient plusieurs valeurs accessibles indépendamment comme dans un objet en java vu que tu connais ce langage...

    regarde la manipulation de types dans la doc...

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Par défaut
    En suivant vos indications j'ai trouvé cette solution afin de répondre au problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT (fct(3)).val3 INTO valQuelconque;
    valQuelconque est obligatoire à mentionner pour éviter une erreur lors de l'appel.
    La fonction est mis entre parenthèses et, à la manière de l'objet, on récupère le paramètre OUT souhaité.




    Merci pour vos messages


    Je passe la discussion à résolue.


  12. #12
    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
    quid du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select val2, val3 into ma_var1, ma_var2 from fct(2)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/06/2014, 17h16
  2. Migration automatique Oracle vers postgreSQL
    Par tchasp dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 28/09/2010, 17h41
  3. procédure stockée + Oracle
    Par BONNEFOI Patrick dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/04/2005, 15h09
  4. Migration de données Oracle vers SQL server
    Par joul's dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 16/02/2005, 15h05
  5. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 09h47

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