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 :

Erreur sur une fonction avec des paramètres


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 17
    Points : 16
    Points
    16
    Par défaut Erreur sur une fonction avec des paramètres
    Bonjour,

    J'ai créé une fonction dont le code est le suivant :

    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
    CREATE FUNCTION transfert_donnee(text, text, text, text, text, text) RETURNS int4 AS 'DECLARE
            t_source ALIAS FOR $1;
            t_dest ALIAS FOR $2;
            ch_source ALIAS FOR $3;
            ch_dest ALIAS FOR $4;
            cle_source ALIAS FOR $5;
            cle_dest ALIAS FOR $6;
            enreg RECORD;
            sql VARCHAR(4000); 
    BEGIN
          FOR enreg IN EXECUTE ''SELECT * FROM '' || t_source LOOP
                sql  :=  ''UPDATE '' || t_dest || '' SET '' || ch_dest || '' =  enreg.'' || ch_source || '' WHERE '' || cle_dest || '' = enreg.'' || cle_source;
                 EXECUTE IMMEDIATE sql;
        END LOOP;
        RETURN 1;
    END;'  LANGUAGE 'plpgsql';
    La création de la fonction se réalise correctement.
    Or au lancement de la fonction tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select transfert_donnee('divers_contacts','info_fiche','prenom','if_zone10','cd','if_indexe');
    Un message d'erreur s'affiche : "ERROR: parser: parse error at or near "$1""

    Après x recherches, je n'ai pas résolu mon problème.

    Pouvez-vous, svp, chercher ce qu'il ne va pas dans ce code ?

    Merci par avance.

    Elois.

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    A priori c'est un problème de quotes.
    essaie :

    sql := ''UPDATE '' || t_dest || '' SET '' || quote_ident(ch_dest) || '' = '' || quote_literal(''enreg.'' || ch_source) || '' WHERE '' || quote_ident(cle_dest) || '' = '' || quote_literal(''enreg.'' || cle_source);

    quote_ident et quote_literal sont des fonctions qui permettent de déléguer à Postgres la tâche (ingrate) de placer des (simples, doubles voir triples ) quotes autour des identifiants et des valeurs littérals.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 209
    Points : 249
    Points
    249
    Par défaut
    Mais il y a un truc qui ne joue pas trop... ta fonction devrait plutôt faire cela:

    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 FUNCTION transfert_donnee(text, text, text, text, text, text) RETURNS int4 AS 'DECLARE 
            t_source ALIAS FOR $1; 
            t_dest ALIAS FOR $2; 
            ch_source ALIAS FOR $3; 
            ch_dest ALIAS FOR $4; 
            cle_source ALIAS FOR $5; 
            cle_dest ALIAS FOR $6; 
            enreg RECORD; 
            sql VARCHAR(4000); 
    BEGIN 
          FOR enreg IN SELECT * FROM ....; 
                 EXECUTE IMMEDIATE "une autre requete qui utilise "enreg""; 
        END LOOP; 
        RETURN 1; 
    END;'  LANGUAGE 'plpgsql';
    Car si tu veux absolument faire un curseur, il faut bien qu'il serve à qqch! Je ne suis pas sûr que tu aies compris le fonctionnement d'un curseur. Dans l'aide tu trouveras quelques exemples qui peuvent t'aider!

    A+

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/11/2012, 19h14
  2. Vue sur une fonction avec des paramètres
    Par The F0x dans le forum PL/SQL
    Réponses: 1
    Dernier message: 04/04/2012, 18h00
  3. [AC-2003] Comment appeler une fonction avec deux paramètres. Erreur '=' attendu
    Par nirG95 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/09/2009, 11h53
  4. Réponses: 6
    Dernier message: 24/02/2005, 10h44
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 14h39

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