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
    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
    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
    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+