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

Requêtes PostgreSQL Discussion :

Postgre 8.3 : Problème lors de l'execution d'une fonction


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 31
    Points : 21
    Points
    21
    Par défaut Postgre 8.3 : Problème lors de l'execution d'une fonction
    Bonjour,

    J'ai créé une procédure afin de lister chaque jour, les saisies d'activités qui n'ont pas été effectué pour la date du jour.
    Quand j'exécute ma fonction, je n'ai pas de message d'erreur mais il ne me retourne aucun enregistrement : "La requête a été exécutée avec succès en 15 ms, mais ne renvoie aucun résultat."
    Quand j'exécute ma requête à part, je récupère bien des enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    id integer
    _________
    2
    3
    4
    6
    12
    14
    Je pense que je n'utilise pas correctement FETCH.
    Merci d'avance pour votre aide.

    Voici le code de ma fonction :
    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
     
    CREATE OR REPLACE FUNCTION fonction_nonsaisie() RETURNS INTEGER AS
    '
    DECLARE
        ref CURSOR for select personnes.id from personnes where (datedeb<=CURRENT_DATE and datefin>=CURRENT_DATE and actif=true) or (datedeb is null and datefin is null and actif=true) EXCEPT select saisies.personne_id from saisies where date_saisie=CURRENT_DATE group by saisies.personne_id having count(saisies.personne_id)=2;
        pers_id int;
     
    BEGIN
     
    OPEN ref;
     
    FETCH ref INTO pers_id;
    LOOP
      insert into nonsaisies (personne_id, date_nonsaisie) values (pers_id,CURRENT_DATE);
    end loop;
    close ref;
     
    RETURN 1;
    END;
    '
    LANGUAGE 'plpgsql';

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Dans le code montré, il n'y a pas de condition de sortie à l'intérieur du LOOP donc ça devrait faire une boucle infinie.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    Merci.
    J'ai modifié le code comme ci-dessous mais j'ai toujours la même erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FETCH ref INTO pers_id;
    LOOP 
      insert into nonsaisies (personne_id, date_nonsaisie) values (pers_id, CURRENT_DATE);
      exit when ref%notfound ;
    end loop;

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Faire plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LOOP 
      FETCH ref INTO pers_id;
      exit when ref%notfound ;
      INSERT INTO nonsaisies (personne_id, date_nonsaisie) VALUES (pers_id, CURRENT_DATE);
    end loop;

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    En modifiant c'est toujours pareil. J'ai essayé en modifiant l'ordre de valorisatiob du curseur, j'obtiens le même résultat.

    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
    CREATE OR REPLACE FUNCTION fonction_nonsaisie() RETURNS INTEGER AS
    '
    DECLARE
        ref refcursor;
        pers_id int;
     
    BEGIN
     
    OPEN ref FOR select personnes.id from personnes where (datedeb<=CURRENT_DATE and datefin>=CURRENT_DATE and actif=true) or (datedeb is null and datefin is null and actif=true) EXCEPT select saisies.personne_id from saisies where date_saisie=CURRENT_DATE group by saisies.personne_id having count(saisies.personne_id)=2;
     
    LOOP 
      FETCH ref INTO pers_id;
      exit when ref%notfound ;
      INSERT INTO nonsaisies (personne_id, date_nonsaisie) VALUES (pers_id, CURRENT_DATE);
    end loop;
     
    close ref;
     
    RETURN 1;
    END;
    '
    LANGUAGE 'plpgsql';

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le même résultat, c'est-à-dire? Parce que le résultat de la fonction à proprement parler est toujours 1, puisqu'elle fait RETURN 1.
    C'est le contenu de la table nonsaisies au retour de la fonction qui n'est pas bon? Dans ce cas quel est le contenu et qu'est-ce qu'il devrait être à la place?

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    Cela venait du "exit when".
    Bon j'ai finalement changer de boucle est là j'obtiens mes résultats. Merci pour votre aide.
    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 OR REPLACE FUNCTION fonction_nonsaisie() RETURNS INTEGER AS
    '
    DECLARE
        mviews RECORD;
     
    BEGIN
     
    FOR mviews IN select personnes.id from personnes where (datedeb<=CURRENT_DATE and datefin>=CURRENT_DATE and actif=true) or (datedeb is null and datefin is null and actif=true) EXCEPT select saisies.personne_id from saisies where date_saisie=CURRENT_DATE group by saisies.personne_id having count(saisies.personne_id)=2 LOOP
      INSERT INTO nonsaisies (personne_id, date_nonsaisie) VALUES (mviews.id, CURRENT_DATE);
    end loop;
     
    RETURN 1;
    END;
    '
    LANGUAGE 'plpgsql';

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    OK. A noter que la boucle n'est même pas nécessaire, il suffit de mettre le select derrière l'insert. Et dans ce cas la fonction elle-même n'est plus nécessaire non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO nonsaisies (personne_id, date_nonsaisie) 
    select personnes.id, CURRENT_DATE
     from personnes where (datedeb<=CURRENT_DATE and datefin>=CURRENT_DATE and actif=true) or (datedeb is null and datefin is null and actif=true)
    EXCEPT
     select saisies.personne_id from saisies where date_saisie=CURRENT_DATE
    group by saisies.personne_id having count(saisies.personne_id)=2

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/12/2010, 14h49
  2. Problème lors de l'execution d'une action
    Par jshems dans le forum Struts 1
    Réponses: 4
    Dernier message: 21/07/2008, 14h13
  3. [MySQL] problème lors de l'appel d'une fonction
    Par jexl dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 27/06/2007, 09h53
  4. [VS]Erreur lors de l'execution d'une fonction
    Par nephhh dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2007, 14h12
  5. Erreur PLSQL lors de l'execution d'une fonction
    Par chicken92000 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 17/03/2006, 17h12

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