Pages: 1
- Sujet précédent - trigger sur longueur/surface dans couche ArcSDE au format SDO_GEOMETRY - Sujet suivant
#1 Thu 18 October 2007 10:39
- imallet
- Participant occasionnel
- Date d'inscription: 8 Sep 2005
- Messages: 13
trigger sur longueur/surface dans couche ArcSDE au format SDO_GEOMETRY
bonjour,
dans des couches stockées dans ArcSDE/Oracle au format SDO_GEOMETRY (Oracle Spatial),
les champs Shape.len et Shape.area sont vides.
j'essaie donc de mettre en place un trigger qui lit la géométrie dans le champ SHAPE au format SDO_GEOMETRY et calcule la longueur à l'aide d'une fonction Oracle spatial (version Oracle 9.2.0.3) , et remplit un nouveau champ créé "Longueur" (réel double)
la commande SQL de création du trigger est la suivante :
CREATE OR REPLACE TRIGGER ABRSECTION_TG
BEFORE INSERT OR UPDATE ON ABRSECTION FOR EACH ROW
BEGIN
SELECT SDO_GEOM.SDO_LENGTH(c.SHAPE,m.DIMINFO) INTO :new.LONGUEUR
FROM ABRSECTION c,USER_SDO_GEOM_METADATA m
WHERE m.TABLE_NAME='ABRSECTION' AND m.COLUMN_NAME='SHAPE';
END;
le trigger est correctement créé dans Oracle et valide.
au moment du compress de l'instance (càd à l'insertion des mises à jour dans la couche versionnée), j'ai l'erreur suivante :
Compress state tree: Are you sure? (Y/N): y
Error: Underlying DBMS error (-51).
Error: Unable to compress state tree.
ORA-04091: table ABR_ARBRES_ALIGNEMENT.ABRSECTION is mutating, trigger/function may not see it
ORA-06512: at "ABR_ARBRES_ALIGNEMENT.ABRSECTION_TG", line 2
ORA-04088: error during execution of trigger 'ABR_ARBRES_ALIGNEMENT.ABRSECTION_TG'
existe-t'il une solution de contournement pour pallier ce problème de "table mutante Oracle" et calculer automatiquement la longueur (ou surface) d'objets dans des couches au format SDO_GEOMETRY ?
merci d'avance de votre aide
Hors ligne
#2 Fri 19 October 2007 19:53
Re: trigger sur longueur/surface dans couche ArcSDE au format SDO_GEOMETRY
Bonjour,
ds le trigger each row c'est pas mal de spécifier les colonnes pour l'UPDATE, genre je recalcule la surface que quand le champ SHAPE bouge...
Code:
CREATE OR REPLACE TRIGGER ABRSECTION_TG BEFORE INSERT OR UPDATE OF "SHAPE" ON ABRSECTION FOR EACH ROW...
et en fait pour éviter la table mutante il suffit de ne pas faire référence ds le trigger à la table que l'on est en train de modifier, en PL/SQL c'est cool :
ce qui doit donner au final un truc du genre :
Code:
CREATE OR REPLACE TRIGGER ABRSECTION_TG BEFORE INSERT OR UPDATE OF "SHAPE" ON ABRSECTION FOR EACH ROW DECLARE dim_info mdsys.sdo_dim_array; requete varchar2(200); BEGIN requete := 'select m.diminfo FROM mdsys.user_sdo_geom_metadata m WHERE m.TABLE_NAME=''ABRSECTION'' AND m.COLUMN_NAME=''SHAPE'''; execute immediate requete into dim_info; :NEW.LONGUEUR := SDO_GEOM.SDO_LENGTH(:NEW.SHAPE,dim_info); end;
ca doit passer mieux
bon courage dans l'enfer passionnant des triggers...
Rémy Gourrat
Dernière modification par AG-Carto (Tue 23 October 2007 17:34)
Hors ligne
#3 Tue 23 October 2007 17:24
- imallet
- Participant occasionnel
- Date d'inscription: 8 Sep 2005
- Messages: 13
Re: trigger sur longueur/surface dans couche ArcSDE au format SDO_GEOMETRY
bonjour,
finalement la syntaxe correcte est :
CREATE OR REPLACE TRIGGER ABRSECTION_TG
BEFORE INSERT OR UPDATE OF "SHAPE" ON ABRSECTION FOR EACH ROW
DECLARE
dim_info mdsys.sdo_dim_array;
requete varchar2(200);
BEGIN
requete := 'select m.diminfo FROM mdsys.user_sdo_geom_metadata m WHERE m.TABLE_NAME=''ABRSECTION'' AND m.COLUMN_NAME=''SHAPE''';
execute immediate requete into dim_info;
:NEW.LONGUEUR := SDO_GEOM.SDO_LENGTH(:NEW.SHAPE,dim_info);
end;
ou bien plus simplement avec une valeur de tolérance (ex : 0.005) dans SDO_LENGTH :
CREATE OR REPLACE TRIGGER ABRSECTION_TG
BEFORE INSERT OR UPDATE OF "SHAPE" ON ABRSECTION FOR EACH ROW
BEGIN
:NEW.LONGUEUR := SDO_GEOM.SDO_LENGTH(:NEW.SHAPE,0.005);
end;
merci encore à AG-CARTO pour les réponses !
:-))
Hors ligne
#4 Tue 23 October 2007 17:44
Re: trigger sur longueur/surface dans couche ArcSDE au format SDO_GEOMETRY
juste pour info SDO_GEOM.SDO_LENGTH et plus généralement SDO_GEOM sont des méthodes rattachées à Oracle Entreprise avec l'option Spatial acquise et donc pas Locator que l'on retrouve sur Oracle Standard Edition & Co
Hors ligne
Pages: 1
- Sujet précédent - trigger sur longueur/surface dans couche ArcSDE au format SDO_GEOMETRY - Sujet suivant