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

Home -> Community -> Mailing Lists -> Oracle-L -> RE: Complex Integrity Checking

RE: Complex Integrity Checking

From: Richard Huntley <rhuntley_at_mindleaders.com>
Date: Tue, 04 Jun 2002 10:38:13 -0800
Message-ID: <F001.00473D55.20020604103813@fatcity.com>


Iulian,

The solution for ORA-4091 is to create two triggers--a row level and a statement level.
In the row level you simply record the values of :new.start_time and :new.end_time into
a PL/SQL table. Then in the statement level trigger you perform the check based on the
recorded values in the PL/SQL table. Record the values using a PL/SQL table in a package,
that way you won't have to worry about simultaneous updates by different sessions. Something
like this...

Interval


s	date
e	date

create or replace package INTERVAL_PACKAGE as

type t_start is table of interval.s%TYPE index by binary_integer; type t_end is table of interval.e%TYPE index by binary_integer;

v_s	t_start;
v_e	t_end;
v_count binary_integer :=0;

end INTERVAL_PACKAGE;

create or replace trigger RINTERVAL
before insert or update on interval
for each row
begin
/* recored new time intervals in interval_package */

  interval_package.v_count := interval_package.v_count + 1;
  interval_package.v_s(interval_package.v_count) := :new.s;
  interval_package.v_e(interval_package.v_count) := :new.e;
end RINTERVAL;

create or replace trigger SInterval
after insert or update on interval
declare

  v_start	interval.s%TYPE;		--from pl/sql table
  v_end		interval.e%TYPE;
  v_start_curr  interval.s%TYPE;	--from interval table
  v_end_curr    interval.e%TYPE;

begin
/* loop through each date interval inserted or updated and verify

        no overlap */
for v_i in 1..interval_package.v_count loop   

  v_start := interval_package.v_s( v_i );   v_end := interval_package.v_e( v_i );  

  /* TEST */
  ...some test goes here...

  if ... then

          --raise_application_error(-20000,'date overlap'||v_start||v_end);   end if;  

end loop;

interval_package.v_count := 0;
interval_package.v_s.DELETE;
interval_package.v_e.DELETE;

end SInterval;
/

-----Original Message-----
Sent: Tuesday, June 04, 2002 12:38 PM
To: Multiple recipients of list ORACLE-L

I don't believe that you can check for overlapping interval within a database trigger. For that, you'd need two tables: one to enter interval and one to check against. Of course, the second table should also be populated, most likely by a 'AFTER INSERT' trigger.

> -----Original Message-----
> From: Iulian.ILIES_at_orange.ro [mailto:Iulian.ILIES_at_orange.ro]
> Sent: Tuesday, June 04, 2002 12:08 PM
> To: Multiple recipients of list ORACLE-L
> Subject: RE: Complex Integrity Checking
> 
> 
> I'm reticent about putting the checking code in the application before
> insert&update statement, although I'm not sure why. I'm just 
> thinking about
> concurency and all the implications. 
> On the other hand I wanted to put the bussiness rules on the 
> database side. 
> Anyway, I'll use this approach, you told me, after all.
> But what if after I check for overlapped intervals, but 
> before inserting,
> another user insert another record with an interval extending 
> over mine. I
> know it sounds crazy but I really like to know how this kind 
> of stuff are
> implemented. That's the way the unique values constraint 
> work, I guess, and
> I'd like to know more about it.
> 
> iulian
> 
> -----Original Message-----
> Sent: Tuesday, June 04, 2002 6:24 PM
> To: Multiple recipients of list ORACLE-L
> 
> 
> maybe I'm being simplistic and I know this will impact performance but
> why not simply do a select to see if the condition exists before the
> insert or update?
> 
> 
> --- Iulian.ILIES_at_orange.ro wrote:
> > I said something like "the way the unique constraints work".
> > Ok. Here's my context.
> > I have a table say intervals and 2 columns start_time and end_time.
> > I want to check for overlapped intervals.
> > I know what conditions to check but I can't implement them.
> > Thanks!
> > 
> > iulian
> > 
> > -----Original Message-----
> > Sent: Tuesday, June 04, 2002 5:13 PM
> > To: Multiple recipients of list ORACLE-L
> > 
> > 
> >
> **********************************************************************
> > This email has been tested for viruses by F-Secure Antivirus
> > administered by IT Network Department.
> >
> **********************************************************************
> > 
> > 
> > Hi
> > 
> > 
> > if unique does not suit your need what exactly do you need to check?
> > duplicates: use primary key
> > 
> > 
> > Jack
> > 
> > 
> >  
> > 
> >                       Iulian.ILIES_at_oran
> > 
> >                       ge.ro                    To:       Multiple
> > recipients
> > of list ORACLE-L <ORACLE-L_at_fatcity.com>                   
> >                       Sent by:                 cc:       (bcc: Jack
> > van
> > Zanen/nlzanen1/External/MEY/NL)                                
> >                       root_at_fatcity.com         Subject:  Complex
> > Integrity
> > Checking                                                    
> >  
> > 
> >  
> > 
> >                       04-06-2002 15:58
> > 
> >                       Please respond to
> > 
> >                       ORACLE-L
> > 
> >  
> > 
> >  
> > 
> > 
> > 
> > 
> > Hi guys. Here's my problem.
> > I want to check the new values (when inserting&updating a table)
> > against
> > the
> > ones in the existing rows. Something like checking for duplicate
> > values,
> > but
> > using a unique constraint doesn't suit my needs.
> > I think of a before insert&update trigger, wherein checking my
> > condition
> > and
> > raise a error if not valid. The problem is, in case of an update
> > statement,
> > I get the mutating "ORA-04091 table <my table> is mutating....".
> > I read a lot of doc but I didn't find any helping ideas. 
> Can you give
> > me
> > some, or maybe a new approach to this kind of problem?
> > Thanks in advance!
> > 
> > iulian
> > 
> > 
> >
> **************************************************************
> **************
> > **
> > 
> > The information contained in this communication is confidential and
> > may be legally privileged. It is intended solely for the use of the
> > individual or entity to whom it is addressed and others 
> authorised to
> > receive it. If you are not the intended recipient you are hereby
> > notified that any disclosure, copying, distribution or taking action
> > in
> > reliance of the contents of this information is strictly prohibited
> > and
> > may be unlawful. Orange Romania SA is neither liable for the proper,
> > complete transmission of the information contained in this
> > communication
> > nor any delay in its receipt.
> >
> **************************************************************
> **************
> > **
> > 
> > 
> > --
> > Please see the official ORACLE-L FAQ: http://www.orafaq.com
> > --
> > Author:
> >   INET: Iulian.ILIES_at_orange.ro
> > 
> > Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> > San Diego, California        -- Public Internet access / Mailing
> > Lists
> > --------------------------------------------------------------------
> > To REMOVE yourself from this mailing list, send an E-Mail message
> > to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
> > the message BODY, include a line containing: UNSUB ORACLE-L
> > (or the name of mailing list you want to be removed from).  You may
> > also send the HELP command for other information (like subscribing).
> > 
> > 
> > 
> > 
> > ==================================================================
> > De informatie verzonden in dit e-mailbericht is vertrouwelijk en is
> > uitsluitend bestemd voor de geadresseerde. Openbaarmaking,
> > vermenigvuldiging, verspreiding en/of verstrekking van deze
> > informatie aan
> > derden is, behoudens voorafgaande schriftelijke toestemming 
> van Ernst
> > &
> > Young, niet toegestaan. Ernst & Young staat niet in voor de 
> juiste en
> > volledige overbrenging van de inhoud van een verzonden 
> e-mailbericht,
> > noch
> > voor tijdige ontvangst daarvan. Ernst & Young kan niet 
> garanderen dat
> > een
> > verzonden e-mailbericht vrij is van virussen, noch dat
> > e-mailberichten
> > worden overgebracht zonder inbreuk of tussenkomst van onbevoegde
> > derden.
> > 
> > Indien bovenstaand e-mailbericht niet aan u is gericht, 
> verzoeken wij
> > u
> > vriendelijk doch dringend het e-mailbericht te retourneren aan de
> > verzender
> > en het origineel en eventuele kopieën te verwijderen en te
> > vernietigen.
> > 
> > Ernst & Young hanteert bij de uitoefening van haar werkzaamheden
> > algemene
> > voorwaarden, waarin een beperking van aansprakelijkheid is 
> opgenomen.
> > De
> > algemene voorwaarden worden u op verzoek kosteloos toegezonden.
> > 
> =====================================================================
> > The information contained in this communication is confidential and
> > is
> > intended solely for the use of the individual or entity to 
> whom it is
> > addressed. You should not copy, disclose or distribute this
> > communication
> > without the authority of Ernst & Young. Ernst & Young is neither
> > liable for
> > the proper and complete transmission of the information contained in
> > this
> > communication nor for any delay in its receipt. Ernst & Young does
> > not
> > guarantee that the integrity of this communication has been
> > maintained nor
> > that the communication is free of viruses, interceptions or
> > interference.
> > 
> > If you are not the intended recipient of this communication please
> > return
> > the communication to the sender and delete and destroy all copies.
> > 
> > In carrying out its engagements, Ernst & Young applies general terms
> > and
> > conditions, which contain a clause that limits its liability. A copy
> > of
> > these terms and conditions is available on request free of charge.
> > ===================================================================
> > 
> > 
> > -- 
> > Please see the official ORACLE-L FAQ: http://www.orafaq.com
> > -- 
> > Author: Jack van Zanen
> >   INET: nlzanen1_at_EY.NL
> > 
> > Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> > San Diego, California        -- Public Internet access / Mailing
> > Lists
> > --------------------------------------------------------------------
> > To REMOVE yourself from this mailing list, send an E-Mail message
> > to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
> > the message BODY, include a line containing: UNSUB ORACLE-L
> > (or the name of mailing list you want to be removed from).  You may
> > also send the HELP command for other information (like subscribing).
> > -- 
> > Please see the official ORACLE-L FAQ: http://www.orafaq.com
> > -- 
> > Author: 
> >   INET: Iulian.ILIES_at_orange.ro
> > 
> > Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> > San Diego, California        -- Public Internet access / Mailing
> > Lists
> > 
> === message truncated ===
> 
> 
> __________________________________________________
> Do You Yahoo!?
> Yahoo! - Official partner of 2002 FIFA World Cup
> http://fifaworldcup.yahoo.com
> -- 
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> -- 
> Author: Rachel Carmichael
>   INET: wisernet100_at_yahoo.com
> 
> Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> San Diego, California        -- Public Internet access / Mailing Lists
> --------------------------------------------------------------------
> To REMOVE yourself from this mailing list, send an E-Mail message
> to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
> the message BODY, include a line containing: UNSUB ORACLE-L
> (or the name of mailing list you want to be removed from).  You may
> also send the HELP command for other information (like subscribing).
> -- 
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> -- 
> Author: 
>   INET: Iulian.ILIES_at_orange.ro
> 
> Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> San Diego, California        -- Public Internet access / Mailing Lists
> --------------------------------------------------------------------
> To REMOVE yourself from this mailing list, send an E-Mail message
> to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
> the message BODY, include a line containing: UNSUB ORACLE-L
> (or the name of mailing list you want to be removed from).  You may
> also send the HELP command for other information (like subscribing).
> 
-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: Gogala, Mladen
  INET: MGogala_at_oxhp.com

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).



-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: Richard Huntley
  INET: rhuntley_at_mindleaders.com

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).
Received on Tue Jun 04 2002 - 13:38:13 CDT

Original text of this message

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