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

#1 04/06/2014 16:54:39

Sadewizz
Membre

supression des double guillemets dans le résultat d'une fonction.

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

#2 05/06/2014 16:39:53

gleu
Administrateur

Re : supression des double guillemets dans le résultat d'une fonction.

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

#3 06/06/2014 11:36:08

Sadewizz
Membre

Re : supression des double guillemets dans le résultat d'une fonction.

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

Pied de page des forums