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 :

Création d'une fonction [debutant]


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Création d'une fonction [debutant]
    Bonjour,

    Je vous expose tout d'abord la base de données:

    Elle est composée de plusieurs "schémas", une public (principal) et plusieurs autres qui peuvent variées.

    Tous les schémas sont structurées de la même manière ainsi il y a les mêmes tables dans le schéma "public" et le schéma "x". Bien-sûr les clés primaires ne sont jamais les mêmes...

    Le problème : j'aimerais créer une fonction qui insérera les données du schéma x vers le schéma public (principal)

    J'ai essayé de créer une fonction, mais bien-sûr, débutant comme je suis, je ne sais même pas si je m'y prend bien.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE FUNCTION copydata(lenomduschema varchar) RETURNS varchar AS $$
    BEGIN
         INSERT INTO public.tablex select * FROM lenomduschema.tablex;
    END;
    $$ LANGUAGE PLPGSQL;

    Cette fonction se crée sans problème mais à l’exécution, "lenomduschema" n'est pas considérée comme une variable mais comme un schéma qui s'appel "lenomduschema".

    Merci beaucoup de pouvoir m'aider.

    KiAhS

  2. #2
    Membre émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    C'est du SQL dynamique, c.a.d qu'il faut considérer la requête SQL comme une chaine de caractères qu'on construit et la lancer avec la fonction EXECUTE de plpgsql.
    Par ailleurs il ne faut pas déclarer la fonction en RETURNS varchar si elle ne retourne rien, mais plutôt en RETURNS void

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse, mais je ne comprend pas comment considérer la requête SQL comme une chaîne de caractères.
    J'ai essayé ça mais sans succès


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace function test(lenomduschema VARCHAR) returns void as $$
    declare
    	toto VARCHAR;
    begin
    	toto = 'insert into public.tablex SELECT * FROM ' + lenomduschema + '.tablex;';
    EXECUTE toto;
    end ; 
    $$ language plpgsql;

    Je n'arrive pas à Comprendre comment ça marche,
    Si quelqu'un pourrai m'éclairer...

    Merci

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ca y est, merci de ton aide...

    voila le code :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace function test(lenomduschema VARCHAR) returns void as $$
    declare
    	toto VARCHAR;
    begin
    	toto = 'insert into public.tablexSELECT * FROM ' || lenomduschema ||'.tablex;';
    EXECUTE toto;
    end ; 
    $$ language plpgsql

    Sympa, pour la réponse rapide ...

    ++

  5. #5
    Membre émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    Juste une remarque: il est préférable de manière générale de faire quote_ident(nomduschema) au lieu de simplement nomduschema. Sinon la requête partira en erreur si le nom de schéma contient des caractères non alphanumériques ou accentués.
    C'est vrai aussi pour les noms de colonnes ou les noms de table.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/03/2011, 11h54
  2. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28
  3. Réponses: 16
    Dernier message: 24/10/2006, 21h37
  4. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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