Triggers, etc
Posté : 22 mai 2007, 14:41
Nous gérons des listes chaînées à l aide des deux tables MAILLON et LISTE_CHAINEE. La table MAILLON contient tous les maillons de toutes les listes chaînées. Elle est définie comme suit
La table LISTECHAINEE contient les ID des débuts de chaque liste chaînée, elle est définie comme suit :
Le sous-programme suivant initialise la table LISTECHAINEE est recherchant tous les début de liste dans la table MAILLON.
Code : Tout sélectionner
CREATE TABLE MAILLON
(
ID NUMBER PRIMARY KEY,
VALEUR NUMBER,
SUIVANT NUMBER REFERENCES MAILLON(ID)
);Code : Tout sélectionner
CREATE TABLE LISTECHAINEE
(
DEBUT PRIMARY KEY,
FOREIGN KEY (DEBUT) REFERENCES MAILLON (ID)
);Code : Tout sélectionner
CREATE OR REPLACE PROCEDURE INITLISTECHAINEE IS
CURSOR maillons IS
SELECT * FROM MAILLON;
m maillons%rowtype;
nbPredecesseurs NUMBER;
BEGIN
FOR m IN maillons LOOP
SELECT count(*) INTO nbPredecesseurs
FROM MAILLON
WHERE suivant = m.ID;
IF nbPredecesseurs = 0 THEN
INSERT INTO LISTECHAINEE VALUES (m.ID);
END IF;
END LOOP;
END;- Ce sous-programme part du principe que si un élément n a pas de prédécesseur, il est un début de liste chaînée.
- Il est possible, sans désactiver de contrainte déclarative, de créer un circuit dans maillon.
- Si la table LISTECHAINEE est vide avant l exécution de INITLISTECHAINEE, il est possible que l exception DUP_VAL_ON_INDEX soit levée pendant l exécution de INITLISTECHAINEE.
- Il n est pas possible, sans désactiver de contrainte déclarative, de placer dans MAILLON des données telles qu un maillon ait plusieurs prédécesseurs.
- INITLISTECHAINEE peut être appelé plusieurs fois de suite sans que cela lève d exception.