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.

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;
et apparait l'erreur suivante :
ORA-13226: interface non prise en charge sans index spatial
Je donc supposé que cela était du à l'utilisation d'un trigger before.
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 :

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;
Et voici la fonction :

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;
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 :
la table SIG_ZA.TAB_A est en mutation; le déclencheur ou la fonction ne peut la voir
Voilà, en bref je suis perdue sur la méthode à employer.
Merci.