Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.server -> Re: trigger puzzlement

Re: trigger puzzlement

From: Connor McDonald <hamcdc_at_yahoo.co.uk>
Date: Fri, 13 Feb 2004 18:17:07 +0800
Message-ID: <402CA423.2E7@yahoo.co.uk>


Mike Stenzler wrote:
>
> This may be obvious, but I don't write many triggers so it's got me
> puzzled..
>
> Row level, after update trigger is designed to perform an insert or update
> to a 2nd table based on existance of a record in the 2nd table.
>
> t1 is updated and has trigger, whenever an update happens, it inserts or
> updates a record in t2. If there has already been an insert "today" (using
> SYSDATE w/ timestamp stripped out) we perform an update on t2, otherwise we
> insert.
>
> Problem is code works fine if we comment out the check for existance and
> just insert records. code works OK if there is an existing record and we
> perform an update. However - if we check for existance and there is no
> record, instead of inserting, we come up with an error saying we can't
> perform an update - another process has a lock.
>
> DATA
>
> CREATE TABLE TEST.T1
> (
> CMDY_SYM VARCHAR2(6)
> ,ZONE1 NUMBER(6,2)
> );
>
> CREATE TABLE TEST.T2
> (
> LAST_CHANGE DATE,
> CMDY VARCHAR2(6)
> ,GV NUMBER(6,2)
> );
>
> code:
>
> "TEST"."AUROW_GRID_CLONE" AFTER
> UPDATE OF "ZONE1" ON "TEST"."T1" FOR EACH ROW
>
> declare v_exists VARCHAR2(6) :='FALSE';
>
> BEGIN
>
> -- test if record has already been inserted today
> select 'TRUE' into v_exists from DUAL where EXISTS
> (select * from test.t2
> where last_change = TO_DATE(TO_CHAR(SYSDATE(), 'MM-DD-YYYY'),'MM-DD-YYYY')
> and cmdy = :new.cmdy_sym
> );
>
> if (v_exists = 'TRUE') then
> update test.t2
> set gv = :new.zone1
> where last_change = TO_DATE(TO_CHAR(SYSDATE(),
> 'MM-DD-YYYY'),'MM-DD-YYYY')
> and cmdy = :new.cmdy_sym;
> else
> insert into test.t2
> ( last_change, cmdy, gv )
> values
> (
> TO_DATE(TO_CHAR(SYSDATE(),'MM-DD-YYYY'),'MM-DD-YYYY'),
> :new.cmdy_sym,
> :new.zone1
> );
> end if;
>
> END;
>
> Any ideas as to whart I'm doing wrong?
>
> Oracle 9.2.0.3
>
> Mike

First thing I'm thinking is a possible data corruption:

Session 1:                 Session 2:

update t1                  update t1
trigger                    trigger
- sees no rows in t2       - sees no rows (since session1 not committed)
- does insert              - does insert

Hmmmmmmmm...

Some suitable primary/unique keys will at least block session 2, but you need to check the multi-user implications as well as the single user implications.

hth
connor

-- 
-------------------------------
Connor McDonald
http://www.oracledba.co.uk
Co-Author: "Mastering Oracle PL/SQL - Practical Solutions"
Received on Fri Feb 13 2004 - 04:17:07 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US