PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 13/09/2012 12:03:25

Geo-x
Membre

Répercution des résultats d'une fonction dans ma table via une vue

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

#2 14/09/2012 22:09:54

gleu
Administrateur

Re : Répercution des résultats d'une fonction dans ma table via une vue

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

#3 27/09/2012 08:50:52

Geo-x
Membre

Re : Répercution des résultats d'une fonction dans ma table via une vue

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

Pied de page des forums