Introduction to Triggers:
Triggers are named PL/SQL blocks.  In that way they are similar to procedures, however 
procedures are involved with an explicit call and a passing of arguments while a trigger 
event causes the implicit execution of the trigger code and arguments are not involved.  
A trigger event  is associated with DML such as INSERT, UPDATE or DELETE and when it is 
executed it is referred to as the "firing" of the trigger.  What this means is that I can 
use a trigger so that if I update a record a trigger event occurs that records the update 
or does some other kind of processing.  When defining the trigger, I can choose to have 
the trigger fire either BEFORE or AFTER the insert, update or delete.  Note: you can use 
the code AFTER INSERT OR DELETE OR UPDATE ON  or you can choose to only do it for one 
thing such as AFTER INSERT ON .  In addition I can choose to have an optional row level 
trigger which fires when a row is effected using the clause FOR EACH ROW or an optional 
event driven trigger that fires because of the event or statement execution.  This is 
handled with a WHEN followed by the trigger condition clause.  Note: a trigger cannot 
include statements like COMMIT, ROLLBACK or SAVEPOINT.  Read more about triggers in your 
text or in the locations on the Web.
In the example below, I created a new table called total_notes.  Whenever I update the 
new_donation_one table I want it to trigger processing that will write a record in 
total_notes telling the hard coded note (I could have uses the system date or had the 
date entered - getting lazy!) and the current sum of the contributions.
SQL CODE:
SQL> create table total_notes
  2  (changedate DATE, totamt NUMBER(6,2));
Table created.
SQL> DESC total_notes
 Name                            Null?    Type
 ------------------------------- -------- ----
 CHANGEDATE                               DATE
 TOTAMT                                   NUMBER(6,2)
The trigger code is shown below.  The name of the trigger is trigger1 and I activated it 
based on the UPDATE of new_donation_one.  Note that I could have used AFTER INSERT OR 
DELETE OR UPDATE ON... if the program did all of these things, my program only does an 
update.  I hardcoded in the date of July 27, 1999 and used SUM to sum the contamt in the 
new_donation_one table and store it in the variable v_totamt.  Then I inserted the hard 
coded date and the result of the sum as a row in the new table I created, total_notes.  
Then I put in the command END trigger1;. Remember that I have to create the trigger 
before it will be used so the next SQL code is @ trigger1.
SQL CODE:
SQL> edit trigger1
PL/SQL CODE:
CREATE OR REPLACE TRIGGER trigger1
   AFTER UPDATE ON new_donation_one 
DECLARE
   v_date     total_notes.changedate%TYPE :='27-JUL-99';
   v_totamt   total_notes.totamt%TYPE;
BEGIN
   SELECT SUM(contamt) INTO v_totamt
   FROM new_donation_one;
   INSERT INTO total_notes (changedate, totamt)
     VALUES(v_date, v_totamt);
END trigger1;
/
SQL CODE:
SQL> @ trigger1
Input truncated to 1 characters
Trigger created.
SQL> edit use_trigger1
The use_trigger code does nothing special, it simply updates the contamt in the 
new_donation_one table for the record where the idno and the driveno are equal to the 
user input.  There is no reference to the trigger.  The trigger when it was created was 
associated with the updating of the new_donation_one table and since this code updates 
that table, it causes the trigger to be fired.
PL/SQL CODE:
DECLARE
  v_idno     new_donation_one.idno%TYPE :='&input_idno';
  v_driveno  new_donation_one.driveno%TYPE :='&input_driveno';
  v_contamt  new_donation_one.contamt%TYPE :=&input_contamt;
BEGIN
  UPDATE new_donation_one
    SET contamt = v_contamt
    WHERE idno = v_idno AND driveno = v_driveno;
END;
/
The SQL below executes use_trigger1 which takes the user input and updates the table.  The 
trigger is fired and a row/record is written in the total_notes table.  The contents of 
both tables are shown below.  Note that I executed use_trigger1, two times.
SQL CODE:
SQL> @ use_trigger1
Input truncated to 1 characters
Enter value for input_idno: 33333
old   2:   v_idno     new_donation_one.idno%TYPE :='&input_idno';
new   2:   v_idno     new_donation_one.idno%TYPE :='33333';
Enter value for input_driveno: 300
old   3:   v_driveno  new_donation_one.driveno%TYPE :='&input_driveno';
new   3:   v_driveno  new_donation_one.driveno%TYPE :='300';
Enter value for input_contamt: 30
old   4:   v_contamt  new_donation_one.contamt%TYPE :=&input_contamt;
new   4:   v_contamt  new_donation_one.contamt%TYPE :=30;
PL/SQL procedure successfully completed.
SQL> SELECT * FROM new_donation_one;
IDNO  DRI CONTDATE    CONTAMT
----- --- --------- ---------
11111 100 07-JAN-99        35
33333 300 10-MAR-99        30
22222 100 14-MAR-99        10
23456 300 14-JUN-99        10
12121 300 10-JUN-99        75
SQL> SELECT * FROM total_notes;
CHANGEDAT    TOTAMT
--------- ---------
27-JUL-99       160
SQL> @ use_trigger1
Input truncated to 1 characters
Enter value for input_idno: 23456
old   2:   v_idno     new_donation_one.idno%TYPE :='&input_idno';
new   2:   v_idno     new_donation_one.idno%TYPE :='23456';
Enter value for input_driveno: 300
old   3:   v_driveno  new_donation_one.driveno%TYPE :='&input_driveno';
new   3:   v_driveno  new_donation_one.driveno%TYPE :='300';
Enter value for input_contamt: 45
old   4:   v_contamt  new_donation_one.contamt%TYPE :=&input_contamt;
new   4:   v_contamt  new_donation_one.contamt%TYPE :=45;
PL/SQL procedure successfully completed.
SQL> SELECT * FROM new_donation_one;
IDNO  DRI CONTDATE    CONTAMT
----- --- --------- ---------
11111 100 07-JAN-99        35
33333 300 10-MAR-99        30
22222 100 14-MAR-99        10
23456 300 14-JUN-99        45
12121 300 10-JUN-99        75
SQL> SELECT * FROM total_notes;
CHANGEDAT    TOTAMT
--------- ---------
27-JUL-99       160
27-JUL-99       195