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 20/04/2004, 16h07   #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 Comment lancer une fonction

Bonjour,

J'ai créé une fonction dans ma base PostGres.
Je voudrais savoir quel est le code qui permet de lancer une fonction.
Voici la fonction que j'ai créé :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE FUNCTION TMP_DIVERS() RETURNS INTEGER AS '
DECLARE
        TMP_DIVERS CURSOR FOR SELECT CODE,DIVERS FROM TMP_DIVERS WHERE CODE IN (SELECT IF_INDEXE FROM INFO_FICHE FOR READ ONLY;
        vCode VARCHAR(49);
        vDivers VARCHAR(49);
        vCompteur INTEGER;
        vNbEnreg  INTEGER;
BEGIN
   OPEN TMP_DIVERS;
   SELECT COUNT(*) INTO vNbEnreg FROM TMP_DIVERS
                               WHERE CODE IN (SELECT IF_INDEXE FROM INFO_FICHE
                               ORDER BY CODE;
   SET vCompteur = 0;
   WHILE
       vCompteur < vNbEnreg DO
       FETCH FROM TMP_DIVERS INTO vCode, vDivers;
       UPDATE INFO_FICHE SET IF_ZONE10 = vDivers WHERE IF_INDEXE = vCode;
       SET vCompteur = vCompteur + 1;
   END WHILE;
   CLOSE TMP_DIVERS;
   RETURN vNbEnreg;
END;
' LANGUAGE 'plpgsql';
Merci, par avance pour votre aide.

Elois.
Elois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2004, 16h31   #2
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Salut,

Pour exécuter une fonction, il faut l'appeler comme si tu voulais appeler une table dans un requête SQL:

A+
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2004, 16h51   #3
Invité régulier
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 6
Points : 6
Merci Bouboubou pour ta réponse.

Cependant j'ai un message d'erreur qui s'affiche après l'execution Voici le message : "ERROR: mismatched parentheses"

Quand penses-tu ?

Cordialement,

Elois.
Elois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 07h40   #4
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Attention à la casse. Postgres n'utilise pas de majuscule. Je te conseil de recréer ta fonction en minuscule et de l'appeler à travers ton select tjs en minuscule.

Normalement, cela devrait jouer!

A+
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 15h49   #5
Invité régulier
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 6
Points : 6
Merci.
J'ai modifié mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE
        tmp_divers CURSOR FOR SELECT code,divers FROM tmp_divers WHERE code IN (SELECT if_indexe FROM info_fiche) FOR READ ONLY;
        count_divers CURSOR FOR SELECT COUNT(*) INTO vNbEnreg FROM tmp_divers WHERE code IN (SELECT if_indexe FROM info_fiche) FOR READ ONLY;
 
        vCode varchar(49);
        vDivers varchar(49);
        vCompteur int4;
        vNbEnreg  int4;
BEGIN
   OPEN count_divers;
   FETCH  count_divers INTO vNbEnreg;
   CLOSE count_divers;    
 
   OPEN tmp_divers;
   vCompteur := 0;
   WHILE vCompteur < vNbEnreg LOOP
   FETCH  tmp_divers INTO vCode, vDivers;
   UPDATE info_fiche SET if_zone10 = vDivers WHERE if_indexe =   vCode;         
   vCompteur := vCompteur + 1;
   END LOOP;
   CLOSE tmp_divers;
   RETURN 1;
END;
Maintenant j'ai un autre message d'erreur :
"ERROR: parser: parse error at or near "$1"".
Malgré mes recherches sur la doc de postgreSQL, je n'ai pas résolu ce problème. Etant débutant dans plpgsql, j'ai mis mes connaissances de PL/SQL Oracle dans ce script. Je pense que les 2 languages sont un peu différents.
Pouvez-vous m'aider, svp, à résoudre ce script :

Merci pour votre aide.

Elois.
Elois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 16h02   #6
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Les $n sont les paramètres formels que tu peux passer à une fonction... donne nous l'entête de ta fonction, stp!

A part cela, tu n'as pas besoin de faire deux curseurs... utilise la boucle for:
Code :
1
2
3
FOR nomTable IN SELECT ... loop
...
end loop;
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 16h25   #7
Invité régulier
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 6
Points : 6
Voici l'entête de la fonction :
Code :
CREATE FUNCTION tmp_divers() RETURNS int4 AS '
Cordialement,

Elois
Elois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2004, 19h10   #8
Invité régulier
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 6
Points : 6
:trouve: Merci Bouboubou, ton aide m'a été précieuse.

Voici le code permettant de créer une fonction qui tranfert une donnée d'un table vers un champ d'une autre table avec la même clé entre l'enreg de la table source et la table de destination :

Code :
1
2
3
4
5
6
7
8
9
CREATE FUNCTION tmp_divers() RETURNS int4 AS '
DECLARE
        enreg RECORD;
BEGIN
   FOR enreg IN SELECT * FROM  tmp_divers LOOP
   UPDATE info_fiche SET if_zone10 = enreg.divers where if_indexe = enreg.code;
   END LOOP;
   RETURN 1;
END;'  LANGUAGE 'plpgsql';
A bientôt,

Elois.
Elois est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web