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

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

 

Pied de page des forums

Powered by FluxBB