#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