Re: Can this be done with a trigger?

From: Shakespeare <whatsin_at_xs4all.nl>
Date: Wed, 6 Aug 2008 17:34:53 +0200
Message-ID: <4899c497$0$49881$e4fe514c@news.xs4all.nl>

<artmerar_at_yahoo.com> schreef in bericht news:90227953-a494-4cf6-9825-5c3857b76127_at_8g2000hse.googlegroups.com...

> On Aug 6, 9:18 am, "Shakespeare" <what..._at_xs4all.nl> wrote:

>> <artme..._at_yahoo.com> schreef in
>> berichtnews:d70b2a64-8d2c-49f4-b3d0-f1fa9389715a_at_56g2000hsm.googlegroups.com...
>>
>>
>>
>> > On Aug 6, 8:09 am, Aya the Vampire Slayer
>> > <ry..._at_gatech.rmv.this.part.edu> wrote:
>> >> artme..._at_yahoo.com wa:
>>
>> >> >On Aug 6, 3:23 am, "Shakespeare" <what..._at_xs4all.nl> wrote:
>> >> >> Do you look for inserting and updating as well in your trigger
>> >> >> (since
>> >> >> you
>> >> >> only posted part of your code)? Or else your triggers fires on an
>> >> >> update and
>> >> >> performs an insert.
>>
>> >> >The trigger fires on insert or update. The actual trigger code is
>> >> >here. Do you see anything wrong with it?
>> >> >CREATE OR REPLACE TRIGGER customer_config_trg
>> >> > INSTEAD OF UPDATE OR INSERT ON customer_config_vw
>> >> > FOR EACH ROW
>> >> >BEGIN
>> >> > IF INSERTING THEN
>>
>> >> You also need to write your INSERT dml for the main table here before
>> >> inserting into the HIST table. An INSTEAD OF trigger doesn't do it
>> >> automatically like BEFORE/AFTER triggers do.
>>
>> >> INSERT INTO CUSTOMER_CONFIG
>> >> VALUES (...);
>>
>> >> > INSERT INTO customer_config_hist
>> >> > VALUES
>> >> >(:NEW.customer_id, :NEW.product_id, :NEW.format, :NEW.status,
>> >> >:NEW.source,
>> >> >SYSDATE);
>> >> > END IF;
>> >> > IF UPDATING THEN
>>
>> >> Same here, you also need to write the UPDATE dml for the main table
>> >> here
>> >> before inserting an entry into the HIST table.
>>
>> >> UPDATE CUSTOMER_CONFIG
>> >> SET FOO = :new.FOO
>> >> (...)
>> >> where (...);
>>
>> >> > IF :NEW.format IS NOT NULL THEN
>> >> > INSERT INTO customer_config_hist
>> >> > VALUES
>> >> >(:NEW.customer_id, :NEW.product_id, :NEW.format, :OLD.status,
>> >> >:NEW.source,
>> >> >SYSDATE);
>> >> > ELSIF :NEW.status IS NOT NULL THEN
>> >> > INSERT INTO customer_config_hist
>> >> > VALUES
>> >> >(:NEW.customer_id, :NEW.product_id, :OLD.format, :NEW.status,
>> >> >:NEW.source,
>> >> >SYSDATE);
>> >> > END IF;
>> >> > END IF;
>> >> >END;
>> >> >/
>>
>> >> --
>> >> "Care must be exorcised when handring Opiticar System as it is apts to
>> >> be sticked by dusts and hand-fat." --Japanese Translators
>>
>> >> "Keep your fingers off the lens." --Elton Byington, English Translator
>>
>> > This is VERY interesting. If you look above at my table definitions,
>> > the last column, SOURCE, is not in the original table that the view is
>> > based on, but is created as a column because it is needed in the
>> > second view.
>>
>> > If I perform an insert using a NULL for the value of that column, as
>> > below, it works fine. But, if I put a value in for that column, it
>> > aborts:
>>
>> > SQL> desc customer_config_vw
>> > Name Null? Type
>> > ----------------------------------------- --------
>> > ----------------------------
>> > CUSTOMER_ID NUMBER
>> > PRODUCT_ID VARCHAR2(10)
>> > FORMAT VARCHAR2(4)
>> > STATUS VARCHAR2(15)
>> > DATE_ADDED DATE
>> > DATE_MODIFIED DATE
>> > SOURCE VARCHAR2
>>
>> > insert into customer_config_vw
>> > values (1234,'PFP','Text','Active',SYSDATE,SYSDATE,NULL);
>>
>> > 1 row created.
>>
>> > insert into customer_config_vw
>> > values (67890,'PPM','HTML','Unsubscribe',SYSDATE,SYSDATE,'A');
>> > insert into customer_config_vw
>> > *
>> > ERROR at line 1:
>> > ORA-03113: end-of-file on communication channel
>>
>> > Any thoughts on this???
>>
>> Somehow something IS wrong here (I can't put my finger on it right now,
>> but
>> let's try):
>> when you create the view, you define a default value for the SOURCE
>> column.
>> Then you perform an update on the view. Though the SOURCE column get's
>> updated, it is not possible to retrieve its value, because of the fixed
>> value in the view definition. As long as NEW.SOURCE is the same value as
>> the
>> default, there's no conflict. But when you update it with a new value,
>> there
>> is a conflict. I think your default is still NULL, right?
>> You could try to replace your view definition with e.g. 'X' as a default
>> value for SOURCE, and then test what happens
>> a) when you update it to 'X'
>> b) when you update it to 'A'.
>> (It might work better because with a default of 'X' at least the type and
>> length of the original and new column match). I have no opportunity to
>> test
>> it right now...
>>
>> Furthermore, you do not write your other values (other than SOURCE) to
>> the
>> original table, due to the INSTEAD OFF trigger. As Aya stated, no values
>> will be written to the table ever.
>>
>> Shakespeare
>
> I changed the trigger.  But I know it has something to do with adding
> that last column........see below.  I also tried your suggestion with
> the column, see below.  All I want is to create a view that contains
> the columns from the first table, along with one column in the second
> table.  Then use the INSTEAD OF trigger to update both tables within
> the body of the trigger.......I'm sure that can be done.
>
> CREATE OR REPLACE VIEW CUSTOMER_CONFIG_VW
> (CUSTOMER_ID, PRODUCT_ID, FORMAT, STATUS, DATE_ADDED,
> DATE_MODIFIED, SOURCE)
> AS
> SELECT CUSTOMER_ID,PRODUCT_ID,FORMAT,STATUS,DATE_ADDED,DATE_MODIFIED,
> 'X' source
>  FROM customer_config
> /
>
>
> SQL> insert into  CUSTOMER_CONFIG_VW (source) values ('X');
>                                       *
> ERROR at line 1:
> ORA-01733: virtual column not allowed here
>
>
>
>
> CREATE OR REPLACE TRIGGER customer_config_trg
>  INSTEAD OF UPDATE OR INSERT ON customer_email_config_vw
>  FOR EACH ROW
>
> BEGIN
>  IF INSERTING THEN
>     INSERT INTO customer_config
>     VALUES
> (:NEW.customer_id, :NEW.product_id, :NEW.format, :NEW.status, :NEW.source,
> SYSDATE);
>
>     INSERT INTO customer_config_hist
>     VALUES
> (:NEW.customer_id, :NEW.product_id, :NEW.format, :NEW.status, :NEW.source,
> SYSDATE);
>  END IF;
>
>  IF UPDATING THEN
>     IF :NEW.format IS NOT NULL THEN
>        UPDATE customer_config
>        SET format = :NEW.format
>        WHERE customer_id = :NEW.customer_id AND product_id
> = :NEW.product_id;
>
>        INSERT INTO customer_config_hist
>        VALUES
> (:NEW.customer_id, :NEW.product_id, :NEW.format, :OLD.status, :NEW.source,
> SYSDATE);
>     ELSIF :NEW.status IS NOT NULL THEN
>        UPDATE customer_config
>        SET status = :NEW.status
>        WHERE customer_id = :NEW.customer_id AND product_id
> = :NEW.product_id;
>
>        INSERT INTO customer_config_hist
>        VALUES
> (:NEW.customer_id, :NEW.product_id, :OLD.format, :NEW.status, :NEW.source,
> SYSDATE);
>     END IF;
>  END IF;
> END;
> /

Maybe it's a typo, but you created a trigger on customer_email_config_vw and inserted into CUSTOMER_CONFIG_VW .
Without an insteadoff trigger, message ORA-1733 is correct.

Shakespeare Received on Wed Aug 06 2008 - 10:34:53 CDT

Original text of this message