Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

GEODATA DAYS 2024

#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

AG-Carto
Participant occasionnel
Date d'inscription: 18 Mar 2006
Messages: 26
Site web

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

AG-Carto
Participant occasionnel
Date d'inscription: 18 Mar 2006
Messages: 26
Site web

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

 

Pied de page des forums

Powered by FluxBB