Vous n'êtes pas identifié(e).
Salut,
J'ai récemment essayer de créer une fonction me permettant de mettre à jour chaque table lors de son insertion dans la base de donnée.
Cependant j'ai un soucis, lorsque je lui dis de créer une nouvelle colonne géométrique. Il faut lui spécifier le type de géométrie de la couche, ce que je fais. Mais le problème est que le type ressort avec un double guillemets.
Voici mon code. L'erreur survient au premier "execute" à la ligne 18.
CREATE OR REPLACE FUNCTION france.maj_2()
RETURNS void AS
$BODY$
DECLARE
liste RECORD;
geom RECORD;
BEGIN
FOR liste IN SELECT tablename FROM pg_tables where tablename
IN
(select tablename from pg_tables where schemaname ='france' and tablename in
(SELECT f_table_name FROM geometry_columns
where f_table_name not like 'france_littoral'))
loop
FOR geom IN SELECT type FROM geometry_columns where f_table_schema='france' AND f_table_name = liste.tablename
loop
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'france' AND TABLE_NAME = liste.tablename AND COLUMN_NAME = 'the_geom_wgs84')
THEN
execute'select addgeometrycolumn ('''','''||quote_ident(liste.tablename)||''',''the_geom_wgs84'',''4326'','''||quote_ident(geom.type)||''',2);
update '||quote_ident(liste.tablename)||' set the_geom_wgs84= st_transform(the_geom_orig,4326);';
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'france' AND TABLE_NAME = liste.tablename AND COLUMN_NAME = 'nom_donnee')
THEN
execute'ALTER TABLE '||quote_ident(liste.tablename)||' ADD COLUMN nom_donnee varchar(80);
update '||quote_ident(liste.tablename)||' set nom_donnee='''||quote_ident(liste.tablename)||''';';
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'france' AND TABLE_NAME = liste.tablename AND COLUMN_NAME = 'id')
THEN
execute'ALTER TABLE '||quote_ident(liste.tablename)||' ADD COLUMN id varchar(80);
ALTER TABLE '||quote_ident(liste.tablename)||' drop constraint '||quote_ident(liste.tablename)||'_pkey;
UPDATE '||quote_ident(liste.tablename)||' set id = nom_donnee||''_''||nextval(''france.id_seq''::regclass);
ALTER TABLE '||quote_ident(liste.tablename)||' add constraint '||quote_ident(liste.tablename)||'_pkey primary key(id);';
end if;
end if;
end if;
end loop;
end loop;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION france.emprise_table()
OWNER TO postgres;
Il me sort donc l'erreur suivante :
ERREUR: la colonne « POINT » n'existe pas
LINE 1: ...addgeometrycolumn ('','b','the_geom_wgs84','4326',"POINT",2)...
^
QUERY: select addgeometrycolumn ('','b','the_geom_wgs84','4326',"POINT",2);
update b set the_geom_wgs84= st_transform(the_geom_orig,4326);
CONTEXT: fonction PL/pgsql maj_2(), ligne 16 à instruction EXECUTE
********** Erreur **********
ERREUR: la colonne « POINT » n'existe pas
État SQL :42703
Contexte : fonction PL/pgsql maj_2(), ligne 16 à instruction EXECUTE
D'après vous, comment puis je retirer ces doubles guillemets? Avez vous une idée?
Merci pour vos éventuelles réponses et bonne soirée (ou journée pour certains) ;D
Sadewizz.
Hors ligne
A priori, cela vient de cet appel : quote_ident(geom.type)
Si geom.type renvoie POINT (donc point en majuscule), la fonction quote_ident ajoutera des guillemets doubles avant et après le type. Si jamais il renvoie point (donc point en minuscule), la fonction ne les ajoutera pas.
Donc tout dépend du contenu. Si vous pouvez changer le contenu par point en minuscule, ce serait mieux. Vous n'auriez pas à changer le contenu de la procédure stockée. Sinon, enlevez l'appel à quote_ident.
Guillaume.
Hors ligne
Bonjour,
Merci pour votre réponse. J'ai suivi vos conseils et j'ai utilisé la fonction LOWER pour changer le contenu du deuxième record (geom)
FOR geom IN SELECT LOWER(type) FROM geometry_columns where f_table_schema='france' AND f_table_name = liste.tablename
Cela fonctionne parfaitement. Merci pour votre aide!!
Bonne journée.
Sadewizz
Hors ligne