PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 21/10/2011 12:02:53

yo_haha
Membre

Problème de variable

Bonjour j'ai une base de données contenant la table sondage. Cette table contient les colonnes geom, coord_x, coord_y et coord_z. J'ai un problème avec la fonction suivante :

CREATE OR REPLACE FUNCTION alimenter_geom(sondage) RETURNS void AS $$
BEGIN
   UPDATE $1
   SET    $1.geom = geomfromtext('POINT('||$1.coord_x||' '||$1.coord_y+1000000||' '||$1.coord_z||')',102581);
END;
$$ LANGUAGE plpgsql;


L'erreur est la suivante :

ERREUR:  erreur de syntaxe sur ou près de « $1 »
LINE 1: UPDATE  $1  SET  $2  = geomfromtext('POINT('|| $3 ||' '|| $4...
                ^
QUERY:  UPDATE  $1  SET  $2  = geomfromtext('POINT('|| $3 ||' '|| $4 +1000000||' '|| $5 ||')',102581)
CONTEXT:  SQL statement in PL/PgSQL function "alimenter_geom" near line 3

********** Erreur **********

ERREUR: erreur de syntaxe sur ou près de « $1 »
État SQL :42601
Contexte : SQL statement in PL/PgSQL function "alimenter_geom" near line 3


Sauriez-vous m'aider ?

Cordialement.

Hors ligne

#2 21/10/2011 12:15:05

gleu
Administrateur

Re : Problème de variable

Vous ne pouvez pas utiliser une variable comme nom d'objet. Les variables ne peuvent être que des valeurs. La solution revient à créer une chaîne représentant la requête et exécuter cette chaîne-requête. D'autre part, la déclaration de la fonction est mauvaise : vous devez au moins indiquer le type.

Ça devrait vous donner ceci :

CREATE OR REPLACE FUNCTION alimenter_geom(text) RETURNS void AS $$
DECLARE
  query text;
BEGIN
   query := 'UPDATE '||$1||'
   SET    '||$1||'.geom = geomfromtext(''POINT('||$1||'.coord_x '||$1||'.coord_y+1000000 '||$1'||.coord_z||')'',102581)';
   PERFORM query;
END;
$$ LANGUAGE plpgsql;

Il faudra vérifier le code, il manque peut-être un guillemet quelque part smile


Guillaume.

Hors ligne

#3 21/10/2011 16:31:15

yo_haha
Membre

Re : Problème de variable

Je vous remercie.
Au lieu de créer la fonction, est-il possible d'exécuter directement la requête SQL suivante ? Existe-t-il la concaténation des chaînes dans les requêtes SQL ? Je n'ai pas l'application sous main : je ne peux pas tester la requête.

UPDATE sondage
SET   sondage.geom = geomfromtext('POINT('||sondage.coord_x||' '||sondage.coord_y+1000000 ||' '||sondage.coord_z||')',102581)

Hors ligne

#4 21/10/2011 16:41:27

Marc Cousin
Membre

Re : Problème de variable

Oui, bien sûr, vous pouvez concaténer dans SQL, avec ||


Marc.

Hors ligne

#5 21/10/2011 16:52:36

yo_haha
Membre

Re : Problème de variable

D'accord. Merci beaucoup.
Est-il possible d'utiliser une table de la BD dans une fonction plpgsql sans aucune déclaration préalable d'aucun objet ?
En d'autres termes, la fonction suivante, est-elle correcte ?

CREATE OR REPLACE FUNCTION alimenter_geom() RETURNS void AS $$
BEGIN
   query := "UPDATE sondage
   SET    sondage.geom = geomfromtext('POINT("||sondage.coord_x||" "||sondage.coord_y+1000000||" "||sondage.coord_z||")',102581)";
   PERFORM query;
END;
$$ LANGUAGE plpgsql;

Hors ligne

#6 21/10/2011 17:15:01

Marc Cousin
Membre

Re : Problème de variable

Non, il faut que vous déclariez query ici.

Par contre vous pouvez, si vous voulez, passer par la syntaxe EXECUTE à la place:
CREATE OR REPLACE FUNCTION alimenter_geom() RETURNS void AS $$
BEGIN
   EXECUTE 'UPDATE sondage SET    sondage.geom = geomfromtext(''POINT("||sondage.coord_x||'' ''||sondage.coord_y+1000000||'' ''||sondage.coord_z||")',102581)';
END;
$$ LANGUAGE plpgsql;

Et attention à ne pas confondre " (double quote) et '' (deux simples quotes). C'est le second qu'il faut utiliser. Le double quote a une signification précise en SQL…


Marc.

Hors ligne

#7 21/10/2011 17:24:07

yo_haha
Membre

Re : Problème de variable

Ok merci.

Hors ligne

Pied de page des forums