Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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: 1160

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: 1160

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

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

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

 

Pied de page des forums

Powered by FluxBB