Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
pg/sql n'accepte pas la requête imbriquée!!
ma requete me parait simple :
select the_geom from (select cname from classofgeometry where eat='-') as c_name;
mais le message d'erreur affiché est : " ERREUR: la colonne « the_geom » n'existe pas"!!!
Hors ligne
Ben... dans ton from, tu as pas de colonnes the_geom donc... Essaye plutot :
select the_geom from (select cname as the_geom from classofgeometry where eat='-') ;
Et encore, je suis pas fan des requete imbriqués donc je peux me tromper
Edit : Enfait, la requete veut strictement rien dire... je l'a laisse au cas ou mais je pense qu'elle est strictement fausse.
Peux tu expliquer plutot ce que tu souhaite faire avec cette requete imbriqué ?
Dernière modification par barthymus (07/02/2013 13:27:45)
Hors ligne
Moi aussi je suis pas fan des requêtes imbriquées mais c ma seule solution. J'ai fait la sous-requête de la clause from pour obtenir le nom de la table (classeofgeometry contient des noms de classes), le contexte de cette requête est un boucle "for" chaque classe de la table classofgeometry, on veut accéder à l'attribut "the_geom" de chaque table.(on veut parcourir tous les valeurs de "the_geom" de tous les tables de la bases).
voilà les 2 boucles (un boucle pour parcourir les noms de tables de la base et le 2ème pour parcourir les valeurs de l'attribut "the_geom" que chaque table en contient) :
for rec1 in select cname from classofgeometry where eat='-'
loop
select cname into c_name from classofgeometry where eat='-';
for rec2 in select the_geom from c_name
loop
...
on veut les rendre dans 1 seul boucle parce que le 2ème boucle de rec2 est fausse; c_name détécté du 1er curseur n'est pas un nom de table(pas accépté par le système). Donc la solution est la suivante:
for rec2 in select the_geom from (select cname from classofgeometry where eat='-')as c_name
loop
....
je ne voit pas que cette requête est fausse, dans sql elle est accéptée, et même dans les tuto pg/sql; il est permis de faire un sous select au niveau de la clause from!
Hors ligne
Bonjour,
si vous voulez parcourir toutes les valeur de "the_geom" de toutes les tables qui contiennent ce champ, l'utilisation de curseurs risque d'avoir de très mauvaises performances. Quelle est la finalité du traitement ?
Sinon, si vous voulez utiliser le nom d'une table dans votre boucle, il faut utiliser une requête dynamique. Exemple :
FOR c_name IN SELECT cname FROM classofgeometry WHERE eat = '-'
LOOP
i := 1;
FOR thegeom IN EXECUTE format('SELECT the_geom FROM %I',c_name)
LOOP
RAISE notice 'Table %, ligne % : %',c_name,i,thegeom;
i := i+1;
END LOOP;
END LOOP;
Dernière modification par rjuju (11/02/2013 12:06:28)
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour,
merci rjuju mais il y a une erreur de synthaxe dans votre exemple:
ERREUR: erreur de syntaxe sur ou près de « ( » au niveau de la ligne "FOR thegeom IN SELECT EXECUTE format('SELECT the_geom FROM %I',c_name)"
"SELECT EXECUTE format" n'est pas accepté.
Hors ligne
Exact, le SELECT devant le EXECUTE est en trop, j'édite l'exemple au dessus.
Julien.
https://rjuju.github.io/
Hors ligne
j'ai effacé la SELECT devant le EXECUTE , mais une autre erreur apparaissent
ERREUR: spécificateur de conversion « i » inconnu
je crois qu'il ne comprend pas que le "i" est la valeur de ième c_name !
(désolé si je vous ai bcq dérangé julien)
Hors ligne
L'erreur semble plutôt provenir du format('SELECT the_geom FROM %I',c_name).
Avez-vous bien mis le %I en majuscule ?
Julien.
https://rjuju.github.io/
Hors ligne
enfin l'exécution marche dans le bon chemin mais le sys cherche la table ayant le nom "(parc_the_geom)" avec les cotes et les parenthèses pas parc_the_geom directement! pourquoi?
ERREUR: la relation « (parc_the_geom) » n'existe pas
LINE 1: SELECT the_geom FROM "(parc_the_geom)"
^
Hors ligne
Je suppose que la table classofgeometry contient les enregistrements comme ça. Il faudrait voir d'où provient cette table, comment elle est remplie etc.
Julien.
https://rjuju.github.io/
Hors ligne
le problème n'est pas au niveau des enregistrements car ils sont insérés correctement. mais apparemment le type 'record' contient les valeurs avec des parenthèses :
begin
FOR c_name IN SELECT cname FROM classofgeometry WHERE eat = ''-''
LOOP
RAISE notice ''Table %'',c_name;
END LOOP;
affiche :NOTICE: Table (parc_the_geom)
par contre si je met la valeur c_name dans une autre variable de type text:
FOR c_name IN SELECT cname FROM classofgeometry WHERE eat = ''-''
LOOP
SELECT cname into name FROM classofgeometry WHERE eat = ''-'';
RAISE notice ''Table %'',name;
END LOOP;
affiche: NOTICE: Table parc_the_geom
Hors ligne
Oui, la requête SELECT cname FROM classofgeometry WHERE eat = ''-'' renvoie un seul champ, il ne faut donc pas utiliser un type record pour la variable c_name.
Julien.
https://rjuju.github.io/
Hors ligne
Oui j'ai changé le type c_name au text et ça marche très bien
Merciii infiniment pour votre aide.
Hors ligne
Pages : 1