[10g]Trigger pour gérer une suite de numéro dans une table
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 :
Code:
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; |
et la fonction
Code:
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 |
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.
Pour le reste, je ne sais pas trop comment faire.
Merci pour vos idées