Bonjour,
Mon problème est le suivant. J'ai deux tables spatiales toutes les deux dotées d'un index spatial : TAB_A et TAB_B.
Mon souhait est que la colonne TAB_A.TAB_A_IDB soit automatiquement alimentée grâce à une requête spatiale à chaque insertion ou mise à jour.
La requête spatiale traduit le fait que l'objet A est contenu dans l'objet B.
J'ai donc réalisé le trigger suivant.
et apparait l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 create or replace TRIGGER TRG_TAB_BEFORE BEFORE INSERT OR UPDATE ON TAB_A REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW Declare ident number; BEGIN ident:= null; select id_b into id_b from TAB_A, TAB_B where sdo_relate(:new.GEOM_A,GEOM_B,'mask=inside')='TRUE'; IF id_b <> null then :new.TAB_A_ID_B := id_b; END IF; END TRG_TAB_BEFORE;
Je donc supposé que cela était du à l'utilisation d'un trigger before.ORA-13226: interface non prise en charge sans index spatial
Avec un trigger After, il m'anonce que ma table est en mutation. Et de même si je créer une fonction à l'intérieur de mon trigger.
trigger after appelant une fonction :
Et voici la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 create or replace TRIGGER TRG_TAB_AFTER AFTER INSERT OR UPDATE OF GEOM_A ON TAB_A BEGIN Update TAB_A set TAB_A_ID_B = RecupId(geom_A); END TRG_TAB_AFTER;
J'ignore si l'on peut utiliser une fonction appelant une géométrie, mais voici donc l'erreur qui m'est renvoyée dans ce cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 create or replace Function recupId(newA in TAB_A.geom_A%TYPE) return varchar2 is Resultat varchar(1000) default null ; id_b number; begin id_b := null ; select TAB_B.TAB_B_ID into id_b from TAB_A, TAB_B where sdo_relate(newA,GEOM_B,'mask=inside')='TRUE'; IF id_b <> null then resultat := id_b; END IF; end;
Voilà, en bref je suis perdue sur la méthode à employer.la table SIG_ZA.TAB_A est en mutation; le déclencheur ou la fonction ne peut la voir
Merci.
Partager