Pages: 1
- Sujet précédent - Requête sans destination pour les données résultantes! Comment faire? - Sujet suivant
#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: 1554
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: 1554
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: 1554
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: 1554
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.
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
Pages: 1
- Sujet précédent - Requête sans destination pour les données résultantes! Comment faire? - Sujet suivant