Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/04/2004, 14h14   #1
Invité régulier
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 6
Points : 6
Par défaut Erreur sur une fonction avec des paramètres

Bonjour,

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

Code :
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 :
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.
Elois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2004, 20h19   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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.
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2004, 21h00   #3
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Mais il y a un truc qui ne joue pas trop... ta fonction devrait plutôt faire cela:

Code :
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+
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h27.


 
 
 
 
Partenaires

Hébergement Web