Vous n'êtes pas identifié(e).
Bonjour @ tous,
J'ai un problème au niveau de la mise à jour d'une table via un UPDATE en passant par une fonction, je vous explique :
J'ai créé une fonction bidule2() qui s'occupe de faire des update sur la base bd_adresse (ici le champ dom_num est mis à jour en faisant une concaténation du champ domanialite et num_voirie) :
CREATE OR REPLACE FUNCTION bidule2("$1" character varying, "$2" character varying, "$3" character varying, "$4" character varying, "$5" character varying, "$6" integer)
RETURNS integer AS
$BODY$
BEGIN
IF
($4='RD' OR $4='VC' OR $4='A') AND (($4<>'' AND $5<>'')OR($4 IS NOT NULL AND $5 IS NOT NULL))
THEN
RAISE NOTICE 'UPDATE %', 'UPDATE bd_adresse SET dom_num='''||$4||$5||'''WHERE ogc_fid='''||$6||'''';
RETURN 1;
ELSE
RETURN 0;
END IF;
Dans la vue de ma table bd_adresse, j'ai créé une RULE pour effectuer la mise à jour :
CREATE OR REPLACE RULE "_UPDATE" AS
ON UPDATE TO bd_adresse_unique_view DO INSTEAD ( SELECT bidule2(new.nom_type, new.nom_article, new.nom_lib, new.domanialite, new.num_voirie, new.ogc_fid) AS bidule;
UPDATE bd_adresse SET ogc_fid = new.ogc_fid, wkb_geometry = new.wkb_geometry, code_insee = new.code_insee, commune = new.commune, id_troncon_bda = new.id_troncon_bda, id_voie_bda = new.id_voie_bda, id_troncon_diag = new.id_troncon_diag, id_voie_diag = new.id_voie_diag, iddomanialite = new.iddomanialite, domanialite = new.domanialite, nom_type = new.nom_type, nom_article = new.nom_article, nom_lib = new.nom_lib, num_voirie = new.num_voirie, nom_voie = new.nom_voie, dom_num = new.dom_num, nom_num = new.nom_num, nom_detaille = new.nom_detaille, nom_detaille_dom_num = new.nom_detaille_dom_num, long_carto_troncon = new.long_carto_troncon, long_carto_voie_bda = new.long_carto_voie_bda, modif_adresse = new.modif_adresse, nb_troncon_bda = new.nb_troncon_bda
WHERE bd_adresse.ogc_fid = old.ogc_fid;
);
Pourtant, lorsque je fais un UPDATE sur ma vue :
UPDATE bd_adresse_unique_view SET num_voirie='30' WHERE ogc_fid='7659'
Ni ma vue, ni ma table source ne se met à jour, hormis num_voirie, alors que le résultat de mon RAISE NOTICE semble plutôt positif :
NOTICE: UPDATE UPDATE bd_adresse_unique_view SET dom_num='RD30'WHERE ogc_fid='7659'
Donc le problème que j'ai ici est : la répercution des résultats de ma fonction dans ma table via une vue.
Merci.
Hors ligne
Pour pouvoir vous aider, il faudrait nous fournir la déclaration de la table bd_adresse et de la vue bd_adresse_unique_view.
Guillaume.
Hors ligne
Bonjour,
J'ai finalement réussi à m'en sortir, en ne faisant plus comme ça :
RAISE NOTICE 'UPDATE %', 'UPDATE bd_adresse SET dom_num='''||$4||$5||'''WHERE ogc_fid='''||$6||'''';
par
UPDATE bd_adresse SET dom_num=$4||$5 WHERE ogc_fid=$6;
Tout simplement.
Cdt
Hors ligne