Solved

Instead of insert question

Posted on 2004-04-09
7
870 Views
Last Modified: 2008-01-09
I am trying to write an instead of insert trigger

-- INSTEAD OF insert on Tertiary Contact views            
      INSERT INTO GWTSDEV.dbcontactperson
             (CONTACTID,
             CONTACTTYPE,            
            TAXID,    
            FIRSTNAME,              
            LASTNAME)          
       VALUES  
             (:contacts.contactid,
                                  :contacts.contacttype,
               :contacts.taxid,
               :contacts.firstname,
               :contcts.lastname);
       commit;
 WHEN duplicate_info THEN
 RAISE_APPLICATION_ERROR (
  num => -21107,
  msg => 'Duplicated Record');
END;

When I use the following code it does not like the 'When' , when I compile. If I use the code below it will compile but when I run the trigger I get FRM-40735:ON-INSERT trigger raised unhandled exception. ORA -00001.

-- INSTEAD OF insert on Tertiary Contact views            
      INSERT INTO GWTSDEV.dbcontactperson
             (CONTACTID,
             CONTACTTYPE,            
            TAXID,    
            FIRSTNAME,              
            LASTNAME)          
       VALUES  
             (:contacts.contactid,
                                  :contacts.contacttype,
               :contacts.taxid,
               :contacts.firstname,
               :contcts.lastname);
       commit;
END;
 

                              
                                    
                        
0
Comment
Question by:uTab
7 Comments
 
LVL 3

Assisted Solution

by:concon
concon earned 125 total points
ID: 10792405
Hi uTab,

try
when DUP_VAL_ON_INDEX then

Regards.
0
 

Author Comment

by:uTab
ID: 10792530
Hi concon,

Now it says that the 'FORM_TRIGGER_FAILURE' is not a proceedure or undefined.

Thanks

 
0
 
LVL 11

Expert Comment

by:pennnn
ID: 10792970
You should use raise_application_error (as you did in your original example), not form_trigger_failure. The form_trigger_failure can be used in Oracle Forms only. It is a predefined exception in Forms, the same way as duplicate_info is a predefined exception in the example from the Oracle SQL Reference manual:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_76a.htm#2064427

You should have copied the DECLARE section also, not only the exception section:
 DECLARE
   duplicate_info EXCEPTION;
   PRAGMA EXCEPTION_INIT (duplicate_info, -00001);

Anyway, it's much cleaner to use concon's suggestion (when_dup_val_on_index).
Hope that helps!
0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 

Author Comment

by:uTab
ID: 10793245
I am using Oracle Forms. The code is as follows:

EXCEPTION
    when DUP_VAL_ON_INDEX then
      Form_Trigger_Failure(
      num => -21107,
      msg => 'Duplicated Contact Information Record');
END;
0
 
LVL 11

Accepted Solution

by:
pennnn earned 125 total points
ID: 10793752
Sorry, the question was misleading - instead of triggers are usually on views, while in forms it's a on-insert trigger...
Anyway, in this case you should use the following:
EXCEPTION
    when DUP_VAL_ON_INDEX then
      raise Form_Trigger_Failure;
END;
Hope that helps!
0
 

Expert Comment

by:bolicat
ID: 11693450
when doing this

SQL> CREATE TRIGGER updDEPT_MAST
  2  INSTEAD OF UPDATE OR INSERT ON vSEL_DEPT_MAST
  3  REFERENCING NEW AS Inserted OLD AS Deleted
  4  BEGIN
  5    IF EXISTS(SELECT 1 FROM Deleted) then
  6       UPDATE DEPT_MAST
  7        SET DEPT_MAST.DEPT_NO = :Inserted.DEPT_NO
  8               ,DEPT_MAST.DEPT_NAME = :Inserted.DEPT_NAME
  9            FROM DEPT_MAST, Inserted
 10            WHERE DEPT_MAST.IMAGE_RECNBR =  :Inserted.IMAGE_RECNBR;
 11      ELSE
 12         INSERT INTO DEPT_MAST SELECT
 13                DEPT_NO
 14               ,DEPT_NAME
 15              FROM Inserted
 16  END
 17  /

getting this

Warning: Trigger created with compilation errors.

SQL>
SQL> show errors trigger updDEPT_MAST;
Errors for TRIGGER UPDDEPT_MAST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/6      PL/SQL: SQL Statement ignored
6/11     PL/SQL: ORA-00933: SQL command not properly ended
13/3     PLS-00103: Encountered the symbol "end-of-file" when expecting
         one of the following:
         ;

SQL>
0
 

Author Comment

by:uTab
ID: 11700247
You are missing the ; on lines 15 and 16.
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article started out as an Experts-Exchange question, which then grew into a quick tip to go along with an IOUG presentation for the Collaborate confernce and then later grew again into a full blown article with expanded functionality and legacy…
Working with Network Access Control Lists in Oracle 11g (part 2) Part 1: http://www.e-e.com/A_8429.html Previously, I introduced the basics of network ACL's including how to create, delete and modify entries to allow and deny access.  For many…
This video shows how to copy a database user from one database to another user DBMS_METADATA.  It also shows how to copy a user's permissions and discusses password hash differences between Oracle 10g and 11g.
This video shows how to copy an entire tablespace from one database to another database using Transportable Tablespace functionality.

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question