#1 Fri 12 October 2018 15:53
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
[Postgis]Plpgsql Probleme EXECUTE UPDATE
Aloha,
Je construis une fonction pour basculer mes géométries d'une colonne à une autre sur l'ensemble des tables d'une base de données.
Code:
CREATE OR REPLACE FUNCTION plm.test_update_geom() RETURNS integer AS $$ DECLARE tgeom RECORD; BEGIN RAISE NOTICE 'Ajout d''une colonne geom plus OGC....'; FOR tgeom IN SELECT * FROM geometry_columns inner join information_schema.tables on table_schema = f_table_schema and table_name = f_table_name and table_type = 'BASE TABLE' where... LOOP ... EXECUTE 'UPDATE '||quote_ident(tgeom.f_table_schema)||'.'||quote_ident(tgeom.f_table_name) ||' SET the_geom_test='||quote_ident(tgeom.f_table_name)||'.'||quote_ident(tgeom.f_geometry_column); ... END LOOP; RAISE NOTICE 'Mise à jour terminée'; RETURN 1; END; $$ LANGUAGE plpgsql;
En résultat, mes colonnes sont bien créées par le début du code (absent de ce message), les index, idem, mais aucune géométrie n'est updatée dans la nouvelle colonne "the_geom_test".
Si j'essaie le code update en dehors de la fonction, il fonctionne.
Comment faire ?
D'avance, merci.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#2 Mon 15 October 2018 09:59
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: [Postgis]Plpgsql Probleme EXECUTE UPDATE
Salut,
pouvez vous poster votre fonction complète s'il vous plait ?
Hors ligne
#3 Mon 15 October 2018 10:09
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [Postgis]Plpgsql Probleme EXECUTE UPDATE
Ci-après
Code:
CREATE OR REPLACE FUNCTION plm.test_update_geom() RETURNS varchar AS $$ DECLARE tgeom RECORD; BEGIN RAISE NOTICE 'Ajout d''une colonne geom plus OGC....'; --- la clause where du select est utilisée pour gérer les exceptions des tables à deux colonnes geom. A vérifier si en prod il y aura ce problème FOR tgeom IN SELECT * FROM geometry_columns inner join information_schema.tables on table_schema = f_table_schema and table_name = f_table_name and table_type = 'BASE TABLE' where f_table_schema = 'plm' and f_table_name not in ('patrimoine_avap','test_gm_vers_qgis') LOOP -- ici peut-être modifié le searchpath pour simplifier les choses EXECUTE 'SET search_path TO '||tgeom.f_table_schema||', public'; RAISE NOTICE 'Mise à jour de la table % ...', quote_ident(tgeom.f_table_name); -- IF -- si la colonne est de type GEOMETRY -- si il y a plusieurs colonnes géométrie RAISE NOTICE 'suppression de la colonne the_geomtest des tables'; EXECUTE 'SELECT DropGeometryColumn ('|| quote_literal(tgeom.f_table_schema)||','|| quote_literal(tgeom.f_table_name)||',''the_geom_test'' '||')'; RAISE NOTICE 'colonne supprimée'; RAISE NOTICE 'SELECT AddGeometryColumn (%,%,''the_geom_test'',%,%,%,true);' , quote_literal(tgeom.f_table_schema), quote_literal(tgeom.f_table_name), quote_literal(tgeom.srid) , quote_literal(tgeom.type), quote_literal(tgeom.coord_dimension); EXECUTE 'SELECT AddGeometryColumn (' || quote_literal(tgeom.f_table_schema)||',' || quote_literal(tgeom.f_table_name)||',''the_geom_test'',' || quote_literal(tgeom.srid)||',' || quote_literal(tgeom.type)||',' || quote_literal(tgeom.coord_dimension)||',true)'; RAISE NOTICE 'colonne ajoutée'; RAISE NOTICE 'on s''occupe de l''index spatial'; EXECUTE 'DROP INDEX IF EXISTS sidx_'||tgeom.f_table_name||'_the_geom_test_gist'; RAISE NOTICE 'CREATE INDEX %_the_geom_test_gist ON %.% USING gist (the_geom_test) TABLESPACE pg_default;' , quote_literal(tgeom.f_table_name), quote_literal(tgeom.f_table_schema), quote_literal(tgeom.f_table_name); EXECUTE 'CREATE INDEX sidx_'||tgeom.f_table_name||'_the_geom_test_gist ON ' ||quote_ident(tgeom.f_table_schema)||'.'||quote_ident(tgeom.f_table_name)|| ' USING gist (the_geom_test) TABLESPACE pg_default'; RAISE NOTICE 'index créé'; RAISE NOTICE 'copie des géométries dans la nouvelle colonne'; EXECUTE 'UPDATE ' ||quote_ident(tgeom.f_table_schema) ||'.'||quote_ident(tgeom.f_table_name) ||' SET the_geom_test = ' ||quote_ident(tgeom.f_table_name) ||'.'||quote_ident(tgeom.f_geometry_column); RAISE NOTICE 'données copiées'; --END END LOOP; RAISE NOTICE 'Mise à jour terminée'; RETURN 'Mise à jour terminée'; END; $$ LANGUAGE plpgsql;
J'ai essayé
Code:
...||'.'||quote_ident(tgeom.f_geometry_column)||'::geometry';
Cela me renvoie une erreur 'quote_ident est un type inconnu...'
J'avoue mon grand désarroi.
Pour info, je suis en pgis 2.34 et en postgre 9.6.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#4 Mon 15 October 2018 17:06
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: [Postgis]Plpgsql Probleme EXECUTE UPDATE
J'ai du mal a dire ce qui ne va pas au premier coup d'oeil.
Mais quel est votre objectif ?
ne pouvez vous pas simplement renommer vos colonnes géométriques existantes,
et en créer une nouvelle vide ?
Hors ligne
#5 Mon 15 October 2018 21:07
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [Postgis]Plpgsql Probleme EXECUTE UPDATE
Aloha
Pensez bien que si j'avais pu renommer les colonnes je l'aurais fait. Non, cela n'apparaît pas, mais mon problème est que les colonnes ont été définies avec le dernier paramètre de AddGeometryColumn à false. Ce qui implique de créer des contraintes etc. Nous souhaitons revenir sur ces définitions et donc basculer les géométries dans des champs geometry dernière mouture...
Mon code pour le moment :
- liste les tables avec une colonne géom
- crée une nouvelle colonne geom
- crée l'index
- devrait copier les géométries dans la nouvelle colonne
A terme, je veux supprimer l'ancienne colonne geom et renommer la nouvelle de l'ancien nom.
J'ai essayé de redéfinir la colonne géométrie, je n'ai réussi à le faire.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#6 Mon 15 October 2018 23:54
Re: [Postgis]Plpgsql Probleme EXECUTE UPDATE
Bonsoir,
Il faut vérifier que tgeom.f_geometry_column <> 'the_geom_test' pour ne pas traiter la colonne the_geom_test sinon, après sa création
Code:
EXECUTE 'UPDATE ' ||quote_ident(tgeom.f_table_schema) ||'.'||quote_ident(tgeom.f_table_name) ||' SET the_geom_test = ' ||quote_ident(tgeom.f_table_name) ||'.'||quote_ident(tgeom.f_geometry_column);
donne
Code:
UPDATE plm.matable SET the_geom_test = the_geom_test
et the_geom_test est NUL
Jean-Marie
Azimut
Hors ligne
#7 Tue 16 October 2018 00:24
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [Postgis]Plpgsql Probleme EXECUTE UPDATE
Bien vu !
Testé ce matin. Merci encore.
Dernière modification par Pierre (Tue 16 October 2018 09:25)
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne