Voila, pour faire simple, j'ai une table qui se référence elle-mêmes pour réprésenter un lien de parenté entre ses divers enregistrement. Je veux ajouter une clause comme quoi un élément ne peux pas avoir comme parent un de ses déscendant !!!
Donc je fais un TRIGGER (pour INSERT et UDATE) dans lequel j'accede à la table que je modifie => probleme de table mutante.
Je veux pas passer par une table temporaire et les autres "astuces" ne seblait pas se preter à mon cas (j'ai essayé INSTEAD OF mais ca ne semble pas etre supporté par mon Oracle (9i)).
Voila, si qqun a deja eu ce probleme...
Merci
Voici mon TRIGGER:
Note: je fais aussi un petit test pour voir si le champ ne contient que des majuscules des chiffres et des tirets
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 CREATE OR REPLACE TRIGGER TR_CK_P_ENTITES_ID_ENTITE BEFORE INSERT OR UPDATE ON P_ENTITES FOR EACH ROW DECLARE laString P_ENTITES.ID_ENTITE%TYPE; liveLength NUMBER; leCar VARCHAR2(1); cpt NUMBER := 0; leParent P_ENTITES.PARENT%TYPE; CURSOR monCurseur IS SELECT ID_ENTITE from P_ENTITES START WITH ID_ENTITE = '||:old.ID_ENTITE||' CONNECT BY PARENT = prior ID_ENTITE; BEGIN IF UPDATING THEN IF (:new.ID_ENTITE != :old.ID_ENTITE) THEN :new.ID_ENTITE := ''; END IF; END IF; laString := :new.ID_ENTITE; liveLength := LENGTH(laString); leParent := :new.PARENT; WHILE cpt<liveLength LOOP leCar := SUBSTR(laString, cpt, 1); IF (INSTR('ABCDEFGHIJKLMNOPQRSTUVW0123456789-', leCar)<=0) THEN :new.ID_ENTITE := ''; END IF; cpt := cpt+1; END LOOP; IF INSERTING THEN :new.PARENT:= :new.PARENT; END IF; IF UPDATING THEN OPEN monCurseur; FOR monCurseurTmp IN monCurseur LOOP IF (:new.PARENT=monCurseurTmp.ID_ENTITE) THEN :new.PARENT := ''; END IF; END LOOP; :new.PARENT:=''; END IF; END;
Partager