Annonce
Pour sécuriser votre compte sur les forums du GeoRezo, nous demandons de changer votre mot de passe.
Vous allez recevoir un message pour effectuer ce changement de mot de passe.
Merci de bien respecter les règles préconisées.
#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