2016-05-04 110 views
0

從我讀過的關於觸發器及其工作原理的角度來看,我認爲這個觸發器將數據插入與我的表格phonenumber相關的關係中,然後再向其中插入值。我正在使用dbms_random創建一個不在用法表中的隨機5位數usageID(或至少這是我原先以爲會這樣做)。爲什麼這個觸發器不能正常工作?

create or replace TRIGGER addPhoneLine 
AFTER INSERT ON phoneNumber 
REFERENCING NEW AS NEW 
    FOR EACH ROW 

DECLARE 
    primNum varchar(12); 
    acctNum numeric(5); 
    NEWusageID_new varchar(5); 

BEGIN 

    if :new.primaryNumber is not NULL then 
     select acctID, primaryNumber into acctNum, primNum 
     from account A 
     where A.primaryNumber = :new.primaryNumber; 

     select to_char(round(dbms_random.value(10000, 99999),0)) into 
NEWusageID_new from dual 
     minus 
     select usageID from usage; 

     INSERT INTO acct_num VALUES 
     (acctNum, primNum, :new.phonenumber); 

     INSERT INTO phone_usage VALUES 
     (NEWusageID_new, :new.phonenumber); 
    end if; 

END; 

但是,當我試圖插入phoneNumber的表,它拋出以下錯誤:

ORA-01403:找不到數據

ORA-06512:在 「ADDPHONELINE」,行9

ORA-04088:觸發器 'ADDPHONELINE' 的執行期間錯誤

相關的表被創建如下:

create table phoneNumber(phoneNumber varchar(12) PRIMARY KEY, primaryNumber varchar(12)); 

create table acct_num(acctID numeric(5) references ACCOUNT, primaryNumber varchar(12) references ACCOUNT, phoneNumber varchar(12) references phoneNumber); 

create table phone_usage(usageID varchar(5) references USAGE, phoneNumber varchar(12) references PHONENUMBER) 

回答

1

您的觸發器基於表phoneNumber上的插入,並在使用SELECT INTO時發生錯誤「找不到數據」,並且它找不到要插入的任何信息。

所以問題一定是這個說法。

select acctID, primaryNumber into acctNum, primNum 
from account A 
where A.primaryNumber = :new.primaryNumber; 

你肯定的是,:new.primaryNumber存在時該觸發器是活動的account表?

也許你只填充account表後插入完成?

0

下面的查詢返回任何行,按錯誤描述您發佈。您的:new.primaryNumber不正確或帳戶表中沒有匹配的記錄。

Begin 
    select acctID, primaryNumber into acctNum, primNum 
    from account A 
    where A.primaryNumber = :new.primaryNumber; 
exception when others then 
    insert your favorite logging method here logging out your :new.primaryNumber 
end; 
+0

如何檢查new.primaryNumber的值?因爲我用以下語句嘗試了這個查詢:new.primaryNumber被我插入的主要數字替代,並且查詢返回了acctID和primaryNumber – JR3652

+0

@ JR3652我用異常處理更新了我的答案。你記錄的方式取決於你使用什麼工具來運行它。最壞的情況下創建一個日誌表並插入一條消息:new.primaryNumber。 –

0

我在這裏告訴你,當DBMS_RANDOM給出的值(NEWusageID_new),它存在於使用會發生什麼:

DECLARE 
    i NUMBER; 
BEGIN 
    SELECT 15 INTO i FROM DUAL 
    MINUS 
    SELECT 15 FROM DUAL; 
END; 

ORA-01403: no data found 
ORA-06512: in line 4 

使用,而不是一個序列。

相關問題