Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 12 March 2013 14:59

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Requête sans destination pour les données résultantes! Comment faire?

Bonjour à tous,

J'ai crée une procédure qui ne retourne aucun résultat (void), vu qu'elle a essentiellement pour tâches de modifier une table (des insert et des updates.

Lorsque je veux exécuter cette procédure de cette façon:

select MaFonction();

Le message d'erreur suivant s'affiche :

"ERREUR:  la requête n'a pas de destination pour les données résultantes
HINT:  Si vous voulez annuler les résultats d'un SELECT, utilisez PERFORM à la place. "

Quand je remplace le select avec un perform, le perform n'est pas reconnu!

Sachant que j'ai d'autres fonctions semblables à celle qui posent problèmes qui marchent très bien!

Merci à vous.

Hors ligne

 

#2 Tue 12 March 2013 15:05

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: Requête sans destination pour les données résultantes! Comment faire?

Bonjour,

Pouvez-vous inclure la definition de la fonction ?
Dans quel langage est-elle ecrite ?

Nicolas

Hors ligne

 

#3 Tue 12 March 2013 15:14

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Requête sans destination pour les données résultantes! Comment faire?

Bonjour Nicolas,

Avec PlSQL.

LA fonction en question ressemble à ça (je l'ai beaucoupppp allégé là vu qu'elle manipule un type compliqué que j'ai crée) :


Code:

DROP FUNCTION Requete6();
CREATE OR REPLACE FUNCTION Requete6()
  RETURNS void AS $$

DECLARE

    les_dures interval[];
    i integer; 
    j integer ;
    dure_tot  interval;  
    pers_recor   record;
    n integer;   
        
    
BEGIN

    
        create table Requete6_Duree(id_personne integer, duree interval );
        
    select "zone" as zonee
    from municipalites as cv 
    where cv.nom_mun = 'Paris';     

    j:=0;
    
    FOR pers_recor IN (SELECT * FROM personne) LOOP

        n:= 30;
        dure_tot := null;
        i := 1;

        
        LOOP
           if i = n+1 then exit; end if;

                        --ici des traitements sur mon type

            dure_tot:= duree_tot + 1;
            
        end if;    

        END LOOP;    
        
             Insert into Requete6_DureesStationnement values( pers_recor.id, duree_tot);
    
END LOOP;
    

END;
$$
  LANGUAGE 'plpgsql' VOLATILE STRICT;

begin;
select Requete6();
commit;

Voilà!


[edit] Pensez à utiliser la balise "Code" c'est beaucoup plus lisible. Christophe pour la modération [\Edit]

Dernière modification par ChristopheV (Tue 12 March 2013 16:32)

Hors ligne

 

#4 Tue 12 March 2013 15:21

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: Requête sans destination pour les données résultantes! Comment faire?

Merci.

Concernant le message, ne vient-il pas du fait que le select que vous faites ne stocke rien dans une variable locale ?

select "zone" as zonee into _zone
    from municipalites as cv
    where cv.nom_mun = 'Paris';

A la place de:

Code:

 select "zone" as zonee
    from municipalites as cv 
    where cv.nom_mun = 'Paris';

Sinon, ce select qui n'est pas utilisé ne sert a rien, non ?

Nicolas

Hors ligne

 

#5 Tue 12 March 2013 15:33

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Requête sans destination pour les données résultantes! Comment faire?

si si,

J'utilise "zonee" dans un test (partie traitement sur mon type), genre :

if( contains(zonee, P) then...end if;

telque P est un point spatial.

Hors ligne

 

#6 Tue 12 March 2013 15:57

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: Requête sans destination pour les données résultantes! Comment faire?

Mais alors il faut stocker la valeur de zone dans une variable.

En faisant: select "zone" as zonee, zonee devient un alias de zone, mais vous n'en faites rien.

Pas plutot: select "zone" INTO zonee
    from municipalites as cv
    where cv.nom_mun = 'Paris';    ?

Apres avoir déclaré zonee.

Nicolas

Hors ligne

 

#7 Tue 12 March 2013 20:41

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Requête sans destination pour les données résultantes! Comment faire?

Bonsoir Nicolas,

Effectivement j'ai fat une confusion entre AS et INTO!

Je m'obstinais à croire que le problème est causé par  "SELECT Requete6()" , alors que c'était le "SELECT" à l'intérieur de la fonction elle même!

Le programme tourne, je n'ai pas encore de résultats mais normalement c'est bon.

Merciii , encore.

Hors ligne

 

#8 Wed 13 March 2013 10:57

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: Requête sans destination pour les données résultantes! Comment faire?

Une petite remarque concernant la partie DECLARE de la fonction plsql:

Apres m'etre bien battu sur certaines fonction, j'ai pris l'habitude de toujours initialiser les variable déclarées avec une valeur non nulle.

Le risque en laissant les variables non initialisées (c'est a dire valant NULL) est de se retrouver avec du code qui ne fait pas ce qu'on veut.
Null est tjs évalué a null dans les comparaisons, les tests (null = null renvoie null, par exemple). Ca peut etre piège. wink

Nicolas

Hors ligne

 

#9 Wed 13 March 2013 11:22

yasmine07
Participant occasionnel
Date d'inscription: 4 Mar 2013
Messages: 21

Re: Requête sans destination pour les données résultantes! Comment faire?

Bonjour,

D'accord!

Merci pour le conseil. Je fais ça avec les pointeurs généralement.

Bonne journée.

Hors ligne

 

Pied de page des forums

Powered by FluxBB