#1 Thu 03 December 2009 12:40
- imenisg
- Participant occasionnel
- Date d'inscription: 9 Oct 2009
- Messages: 10
distance
salut
je veux faire une fonction dans postgresql je veux calcule le distance entre deux points l une est dans le colonne posit et l'autre je lui donner mais ça n'as pas marcher
Code:
DECLARE req text; ste RECORD; ff POINT; BEGIN ff=GeometryFromText('POINT(191232 243118)',-1); req := 'SELECT * FROM deplaceee where Distance(posit,'||ff||')=0'; --||ff||')=0 '; EXECUTE req INTO ste ; RETURN ste.hhh ; END;
resultat
invalid input syntax for type point: "010100000000000000005807410000000070AD0D41"
merci d'avance
imen
Dernière modification par imenisg (Thu 03 December 2009 12:42)
Hors ligne
#2 Thu 03 December 2009 14:21
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: distance
salut
je veux faire une fonction dans postgresql je veux calcule le distance entre deux points l une est dans le colonne posit et l'autre je lui donner mais ça n'as pas marcherCode:
DECLARE req text; ste RECORD; ff POINT; BEGIN ff=GeometryFromText('POINT(191232 243118)',-1); req := 'SELECT * FROM deplaceee where Distance(posit,'||ff||')=0'; --||ff||')=0 '; EXECUTE req INTO ste ; RETURN ste.hhh ; END;resultat
invalid input syntax for type point: "010100000000000000005807410000000070AD0D41"
merci d'avance
imen
Bonjour
La fonction distance prend deux geometries, pas du texte.
Il faut soit caster le point (sous forme de texte) en geometry, soit
utiliser une fonction pgis pour convertir un point en geometry:
'POINT (x y)'::geometry
ou
geomfromwkt('POINT (x y)');
Il faudra aussi faire attention au SRID des geometries utilisées dans la requete (setsrid ou ewkt pour construire une geometrie avec SRID different de -1)
(dans le code, vous faites ff='POINT(191232 243118)'; Si vous voulez affecter a la variable ff le point, il faut utiliser :=, pas =
Nicolas
Hors ligne
#3 Thu 03 December 2009 14:37
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: distance
salut
je veux faire une fonction dans postgresql je veux calcule le distance entre deux points l une est dans le colonne posit et l'autre je lui donner mais ça n'as pas marcherCode:
DECLARE req text; ste RECORD; ff POINT; BEGIN ff=GeometryFromText('POINT(191232 243118)',-1); req := 'SELECT * FROM deplaceee where Distance(posit,'||ff||')=0'; --||ff||')=0 '; EXECUTE req INTO ste ; RETURN ste.hhh ; END;resultat
invalid input syntax for type point: "010100000000000000005807410000000070AD0D41"
merci d'avance
imen
Et egalement, la syntaxe de la requete n'est pas bonne: il ne faut pas concatener ff a la requete, mais l'utiliser directement dans la requete: distance(posit, ff)
Ou mieux utiliser la commande EXECUTE
une bonne introduction a plpgsql se trouve dans l'aide de PG:
http://www.postgresql.org/docs/8.4/static/plpgsql.html
Nico
Hors ligne
#4 Thu 03 December 2009 17:06
Re: distance
(dans le code, vous faites ff='POINT(191232 243118)'; Si vous voulez affecter a la variable ff le point, il faut utiliser :=, pas =
A noter juste pour que tout soit clair, que le symbole "=" dans pl/pgsql fonctionne pour faire une affectation, mais ce n'est pas documenté, et c'est surtout fortement déconseillé car il entre souvent en conflit avec la fonction de comparaison d'égalité.
Donc Nicolas a bien raison, pour une affectation il faut utiliser ":=".
vincent
Hors ligne
#5 Thu 03 December 2009 17:37
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: distance
Nicolas Ribot a écrit:(dans le code, vous faites ff='POINT(191232 243118)'; Si vous voulez affecter a la variable ff le point, il faut utiliser :=, pas =
A noter juste pour que tout soit clair, que le symbole "=" dans pl/pgsql fonctionne pour faire une affectation, mais ce n'est pas documenté, et c'est surtout fortement déconseillé car il entre souvent en conflit avec la fonction de comparaison d'égalité.
Donc Nicolas a bien raison, pour une affectation il faut utiliser ":=".
vincent
Ah, merci pour cette precision, je ne savais pas.
je me souviens juste m'etre arraché les cheveux sur les erreurs plpgsql a cause de ces affectations.
Nico
Hors ligne