Вернуться
Листинг 1
Общая схема организации триггеров для предотвращения ошибок, вызванных изменяемыми или ограничиваемыми таблицами.
--| PACKAGE PK_Triggnnn
Create Or Replace Package PK_Triggnnn Is
triggersEnabled Boolean:=true;
Procedure P_Reset;
Procedure P_PutRowList(inRec In
%RowType,
isNew In Boolean);
Function F_EmptyRowList(isNew In Boolean)
Return Boolean;
Procedure P_Handle_Insert;
Procedure P_Handle_Update;
Procedure P_Handle_Delete;
End PK_Triggnnn;
/
--| PACKAGE BODY PK_Triggnnn
Create Or Replace Package Body PK_Triggnnn Is
Type RowListType Is Table Of %RowType
Index By Binary_Integer;
newList RowListType;
oldList RowListType;
emptyList RowListType;
newCount# Number:=0;
oldCount# Number:=0;
Procedure P_Reset Is
Begin
newCount#:=0; oldCount#:=0;
newList:=emptyList; oldList:=emptyList;
End P_Reset;
Procedure P_PutRowList(inRec In %RowType,
isNew In Boolean) Is
Begin
If isNew Then
newCount#:=newCount# + 1;
newList(newCount#).:=inRec.;
...........
newList(newCount#).:=inRec.;
Else
oldCount#:=oldCount# + 1;
oldList(oldCount#).:=inRec.;
...........
oldList(oldCount#).:=inRec.;
End If;
End P_PutRowList;
Function F_EmptyRowList(isNew In Boolean) Return
Boolean Is
Begin
If isNew Then
Return (newCount# = 0);
Else
Return (oldCount# = 0);
End If;
End F_EmptyRowList;
Procedure P_Handle_Insert Is
Begin
While newCount# > 0 Loop
--| .....<Обработка вносимых записей>
newCount#:=newCount# - 1;
End Loop;
End P_Handle_Insert;
Procedure P_Handle_Delete Is
Begin
While oldCount# > 0 Loop
--| .....<Обработка удаляемых записей>.....
oldCount#:=oldCount# - 1;
End Loop;
End P_Handle_Delete;
Procedure P_Handle_Update Is
Begin
While newCount# > 0 Loop
--| .....<Обработка обновляемых записей>.....
newCount#:=newCount# - 1;
oldCount#:=oldCount# - 1;
End Loop;
End P_Handle_Update;
End PK_Triggnnn;
/
--| INSERT TRIGGER
Create Or Replace Trigger IBS_ Before
Insert On
Begin
If PK_Triggnnn.triggersEnabled Then
PK_Triggnnn.P_Reset;
End If;
End;
/
Create Or Replace Trigger IBR_ Before
Insert On For Each Row
Declare
inRec %RowType;
Begin
If PK_Triggnnn.triggersEnabled Then
--|......<Обработка вносимой записи>......
--| Запоминание значений полей вносимой записи
inRec.:=:new.;
...........
inRec.:=:new.;
PK_Triggnnn.P_PutRowList(inRec,True);
End If;
End;
/
Create Or Replace Trigger IAR_ After Insert
On For Each Row
Begin
If PK_Triggnnn.triggersEnabled Then
--|......<Обработка внесенной записи>......
End If;
End;
/
Create Or Replace Trigger IAS_ After Insert On
Begin
If PK_Triggnnn.triggersEnabled Then
If Not PK_Triggnnn.F_EmptyRowList(True) Then
PK_Triggnnn.P_Handle_Insert;
End If;
End If;
End;
/
--| DELETE TRIGGER
Create Or Replace Trigger DBS_ Before
Delete On
Begin
If PK_Triggnnn.triggersEnabled Then
PK_Triggnnn.P_Reset;
End If;
End;
/
Create Or Replace Trigger DBR_ Before
Delete On For Each Row
Declare
inRec %RowType;
Begin
If PK_Triggnnn.triggersEnabled Then
--|......<Обработка удаляемой записи>......
--| Запоминание значений полей удаляемой записи
inRec.:=:old.;
...........
inRec.:=:old.;
PK_Triggnnn.P_PutRowList(inRec,False);
End If;
End;
/
Create Or Replace Trigger DAR_ After
Delete On For Each Row
Begin
If PK_Triggnnn.triggersEnabled Then
--|......<Обработка удаляемой записи>......
End If;
End;
/
Create Or Replace Trigger DAS_ After
Delete On
Begin
If PK_Triggnnn.triggersEnabled Then
If Not PK_Triggnnn.F_EmptyRowList(False) Then
PK_Triggnnn.P_Handle_Delete;
End If;
End If;
End;
/
--| UPDATE TRIGGER
Create Or Replace Trigger UBS_ Before
Update On
Begin
If PK_Triggnnn.triggersEnabled Then
PK_Triggnnn.P_Reset;
End If;
End;
/
Create Or Replace Trigger UBR_ Before
Update On For Each Row
Declare
inRec %RowType;
Begin
If PK_Triggnnn.triggersEnabled Then
--|......<Обработка обновляемой записи>......
--| Запоминание новых значений полей обновленной записи
inRec.:=:new.;
...........
inRec.:=:new.;
PK_Triggnnn.P_PutRowList(inRec,True);
--| Запоминание старых значений полей обновленной записи
inRec.:=:old.;
...........
inRec.:=:old.;
PK_Triggnnn.P_PutRowList(inRec,False);
End If;
End;
/
Create Or Replace Trigger UAR_ After
Update On For Each Row
Begin
If PK_Triggnnn.triggersEnabled Then
--|......<Обработка обновляемой записи>......
End If;
End;
/
Create Or Replace Trigger UAS_ After
Update On
Begin
If PK_Triggnnn.triggersEnabled Then
If Not PK_Triggnnn.F_EmptyRowList(True) Then
PK_Triggnnn.P_Handle_Update;
End If;
End If;
End;
/
Вернуться