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 :

Comment lancer une fonction


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 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 : 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
    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.

  2. #2
    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
    Salut,

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

    A+

  3. #3
    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
    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.

  4. #4
    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
    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+

  5. #5
    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
    Merci.
    J'ai modifié mon code :
    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
    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.

  6. #6
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for nomTable in select ... loop
    ...
    end loop;

  7. #7
    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
    Voici l'entête de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE FUNCTION tmp_divers() RETURNS int4 AS '
    Cordialement,

    Elois

  8. #8
    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
    :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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/09/2009, 21h00
  2. Réponses: 6
    Dernier message: 25/06/2009, 11h57
  3. Comment lancer une fonction présente sur une autre page ?
    Par mappy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2006, 14h44
  4. Comment lancer une fonction à une date donnée
    Par ideal dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/02/2006, 12h52
  5. [PHP-JS] comment lancer une fonction javascript a partir de php
    Par amika dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/06/2005, 19h23

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