Re: Trigger Question
Date: Fri, 22 Mar 2002 16:42:50 GMT
Message-ID: <Xns91D9796A33E60kendenny_at_65.82.44.7>
Jerry Davidson <jerry_davidson_at_compuserve.com> wrote in news:3C9B604D.90306_at_compuserve.com:
> I want to have a "Before Insert" trigger become conditional.  Here is 
> the situation:
> 
> You can insert a new record from a screen (user types it in).  In that 
> case, the trigger will access a sequence and use that to populate the 
> field.  This works and here is the trigger
> 
> ===========================================================
> CREATE OR REPLACE TRIGGER USA_Contractor_BI
>    BEFORE INSERT
>    ON USA_Contractor
>    FOR EACH ROW
> declare
>      newid number;
>    begin
>      select USA_Contractor_seq.nextval
>        into newid from dual;
> 
>      :new.Contractor_Key := newid;
>      :new.Contractor_ID := 'CID' || LPAD(TO_CHAR(newid), 5, '0');
>      :new.Create_Date := sysdate;
> END USA_Contractor_BI;
> ============================================================
> 
> A second way a record can get into the table is if the user restores it
> from an archive table.  In that case I don't want the sequence to be 
> triggered because it will screw up the ID.  I thought to add the
> following: 
> 
> =============================================================
> CREATE OR REPLACE TRIGGER USA_Contractor_BI
>    BEFORE INSERT
>    ON USA_Contractor
>    FOR EACH ROW
>    WHEN (:old.contractor_id IS NULL)
> declare
>      newid number;
>    begin
>      select USA_Contractor_seq.nextval
>        into newid from dual;
> 
>      :new.Contractor_Key := newid;
>      :new.Contractor_ID := 'CID' || LPAD(TO_CHAR(newid), 5, '0');
>      :new.Create_Date := sysdate;
> END USA_Contractor_BI;
> ==============================================================
> 
> The difference is the "WHEN" clause.  I'm trying to identify cases
> where the value is already there (archived records) using the "old"
> buffer. 
> 
> Doesn't like the check for a null value.  What am I doing wrong?
You can't check for :old on an insert. :old.* will always be null on an insert. You should be checking WHEN (:new.contractor_id IS NULL). If the record being inserted already has a contractor_id then the trigger will not fire.
-- Ken Denny http://www.kendenny.com/ An unemployed court jester is nobody's fool.Received on Fri Mar 22 2002 - 17:42:50 CET
