Vous n'êtes pas identifié(e).
Pages : 1
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
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
Guillaume.
Hors ligne
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
Oui, bien sûr, vous pouvez concaténer dans SQL, avec ||
Marc.
Hors ligne
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
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
Ok merci.
Hors ligne
Pages : 1