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

Printemps des cartes 2024

#1 Sat 18 July 2009 13:34

jims
Juste Inscrit !
Date d'inscription: 4 Oct 2007
Messages: 5

MAJ champ geom >> recalculer la superficie (oracle 9i)

Bonjour à tous ,

j'aimerai bien si quelqu'un peut m'aider à trouver la solution à mon sujet
j'en suis certain c'est facile j'ai cherché partout mais j'ai pas trouvé de solution
Merci de m'aider

- créer un Trigger  qui :
    1) calcul la superficie lors de l'insertion d'un parcelle
    2) recalcule automatiquement la superficie de la géométrie modifiée, dans le cas de mise à jour.


j'ai essayé ceci
WHERE :old.geom <> :new.geom

ORA-04091: table GIS.PARCELLE en mutation, déclencheur/fonction ne peut la voir
ORA-06512: à "GIS.TRG_PARCELLE", ligne 39
ORA-04088: erreur lors d'exécution du déclencheur 'GIS.TRG_PARCELLE'


I- mon Premier soucis comment je peux recuperer l'identifiant de l'enregistrement en cours,
pour le cas d'insertion j'ai essayé ceci qui sa marche mais,...
je crains que si il y a plusieurs utilisateurs en même temps qui sont entrain d'insérer des parcelles, l'exécution du trigger peut sauter des nouveaux parcelles insérés

select SDO_GEOM.sdo_area(geom,0.05) into :new.SUPERFICIE
from parcelle where id_parcel = (select max(id_parcel) from PARCELLE) ;


II- pour le mode MAJ

j'ai essayé ceci
WHERE :geom <> :old.geom
erreur
ORA-22901: impossible de comparer les attributs table imbriquée, VARRAY ou LOB d'un type d'objet



SCRIPT en DETAIL

--------------------------------------------PL/SQL------------------------------------
----------------------------------------Oracle 9i---------------------------------------

CREATE OR REPLACE TRIGGER "GIS"."TRG_PARCELLE" BEFORE
INSERT
OR UPDATE ON "PARCELLE" FOR EACH ROW DECLARE

BEGIN


IF INSERTING THEN


select SDO_GEOM.sdo_area(geom,0.05) into :new.SUPERFICIE
from parcelle where id_parcel = (select max(id_parcel) from PARCELLE) ;


ELSIF  UPDATING('geom')  THEN

-----------------1er cas essayé------------------------------
--  UPDATE PARCELLE
--SET SUPERFICIE  = (select SDO_GEOM.sdo_area(geom,0.05)
--from parcelle where :old.geom <> :new.geom)
--WHERE :old.geom <> :new.geom ;


-----------------2eme cas essayé------------------------------
SELECT SDO_GEOM.SDO_AREA(c.geom, m.diminfo)
into :new.SUPERFICIE
FROM PARCELLE c, user_sdo_geom_metadata m
WHERE m.table_name = 'PARCELLE' AND m.column_name = 'GEOM'
AND old.geom <> :new.geom ;

end if;
end;
----------------;


Cordialement
Geomaticien ;

Hors ligne

 

#2 Mon 20 July 2009 11:19

Cartosig
Participant assidu
Date d'inscription: 16 Oct 2006
Messages: 222

Re: MAJ champ geom >> recalculer la superficie (oracle 9i)

Bonjour,

1. Je pense que la méthode est fiable mais je n'en suis pas sur a 100%. Comme vous le dite il peut y avoir un risque de confusion entre parcelles en faisant une sélection d'ID avec "id_parcel = (select max(id_parcel) from PARCELLE)". Il faut être certain qu'un lock est posé sur la table lors de l'update / insert pour avoir la garantie que la bonne superficie est attribuée au bon ID. A voir du côté administration de la base.

2. WHERE :geom <> :old.geom -> on ne peut pas comparer des géométries avec des opérateurs simples comme = ou <>. Référez-vous aux docs Oracle sur les opérateurs spatiaux (SDO_RELATE notamment). http://download.oracle.com/docs/html/A96630_01/toc.htm

A+

Hors ligne

 

#3 Tue 21 July 2009 13:58

jims
Juste Inscrit !
Date d'inscription: 4 Oct 2007
Messages: 5

Re: MAJ champ geom >> recalculer la superficie (oracle 9i)

je vous remercie énormément Cartosig, vous m'avez indiquer la piste à chercher, si je trouve la solution je vais la diffuser.

Cordialement

Hors ligne

 

Pied de page des forums

Powered by FluxBB