2017-03-01 9 views
0

以下のトリガーでは、duplicate_info例外がbeginブロック内で発生させずに使用されていますが、これはどのように動作するのかわかりません。ほかにも例外はありませんが、このduplicate_info例外が機能します。奇妙な!プライマリまたは一意性制約に違反しOracleトリガーのユーザー定義例外

CREATE OR REPLACE TRIGGER ORDER_INFO_T 
INSTEAD OF INSERT ON order_info 
DECLARE 
    duplicate_info EXCEPTION; 
    PRAGMA EXCEPTION_INIT (duplicate_info, -00001); 
BEGIN 
    INSERT INTO customers 
    (customer_id, cust_last_name, cust_first_name) 
    VALUES (
    :new.customer_id, 
    :new.cust_last_name, 
    :new.cust_first_name); 

    INSERT INTO orders (order_id, order_date, customer_id) 
    VALUES (
    :new.order_id, 
    :new.order_date, 
    :new.customer_id); 
EXCEPTION 
    WHEN duplicate_info THEN 
     RAISE_APPLICATION_ERROR (
     num=> -20107, 
     msg=> 'Duplicate customer or order ID'); 
END order_info_insert; 
/

答えて

2

、Oracleはエラーが発生:

ORA-00001: unique constraint (schemaname.constraintname) violated

トリガが例外duplicate_infoを定義した後、プラグマを介してORA-00001エラーとそれに関連している:

PRAGMA EXCEPTION_INIT (duplicate_info, -00001); 

これは、OracleがエラーORA-00001を発生させたときに、関連するユーザ定義の例外duplicate_infoが発生されることを意味します。

OracleはすでにORA-00001のためのanexception DUP_VAL_ON_INDEXを提供するので、それは、しかし、非常に冗長です:

CREATE OR REPLACE TRIGGER ORDER_INFO_T 
INSTEAD OF INSERT ON order_info 
BEGIN 
INSERT INTO customers 
(customer_id, cust_last_name, cust_first_name) 
VALUES (
:new.customer_id, 
:new.cust_last_name, 
:new.cust_first_name); 
INSERT INTO orders (order_id, order_date, customer_id) 
VALUES (
:new.order_id, 
:new.order_date, 
:new.customer_id); 
EXCEPTION 
WHEN dup_val_on_index THEN 
RAISE_APPLICATION_ERROR (
num=> -20107, 
msg=> 'Duplicate customer or order ID'); 
END order_info_insert; 
関連する問題