Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/03/2011, 10h35   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 0
Points : 0
Par défaut mise à jour par requête spatiale

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 :
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 :
Citation:
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 :
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 :
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 :
Citation:
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.
amelo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h10.


 
 
 
 
Partenaires

Hébergement Web