Bonjour,
Tout d'abord, désolé si mes questions parraissent bête, je suis novice.
Voici mon problème. J'ai une table Pages reliée à une table classeur.
Chaque page a un numéro et appartient à un classeur. Ainsi la table page possède un clé primaire : num_page, et une clé etrangère : num_classeur.
Je dois ecrire un trigger qui s'assure que les numéros des pages sont successfis pour un même classeur (de 1 au nombre de pages du classeur).
Apres reflexion:
- insertion : on vérifie que la nouvelle page est supérieure à 0 et vaut le maxumum de tous les numéros de pages du classeur + 1
- update : le nouveau numéro de page doit être supérieur ou égale à ce maximum et ensuite on effectue un décalage de toutes les pages situées apres celle updatée.
- delete, simple décalage de toutes les pages situées apres
Mais comment mettre ça en oeuvre en PL/SQL ?
J'ai déjà fait ça :
et la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 create or replace trigger "TRG_PAGE_NUM" BEFORE insert or update or delete on "PAGE" for each row begin if NOT IS_GOOD_NUM_PAGE(:NEW.ID_PAGE, :NEW.ID_CLASSEUR) then RAISE_APPLICATION_ERROR ( -20021, 'Le numéro de page pour ce classeur est invalide' ); end if; end;
La fonction ne fait pas grand chose pour l'instant, juste parcourir la table page pour définir toutes les pages du classeur passé en paramètre et de les classés.
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 create or replace function "IS_GOOD_NUM_PAGE" (id_p in NUMBER, id_c in NUMBER) return BOOLEAN is existing boolean; a number; cursor srv_line is Select ID_PAGE From PAGE where ID_CLASSEUR = ID_C ORDER by ID_PAGE; begin existing := true; open srv_line; -- Ouverture loop fetch srv_line into a; -- Lecture de la ligne Exit when srv_line%NOTFOUND; end loop; close srv_line; -- Fermeture
Pour le reste, je ne sais pas trop comment faire.
Merci pour vos idées
Partager