2010-06-08 46 views
4

我有一個觸發器引發了一個錯誤,我不知道如何知道PL/SQL代碼的哪一行正在拋出該錯誤。我的錯誤是行編號如何在Oracle觸發器中工作?

[甲骨文] ORA-01403:找不到數據 ORA-06512:在 「MYSCHEMA.FOO_BI」,9號線

我的觸發是這樣的:

create or replace TRIGGER "MYSCHEMA"."FOO_BI" 
BEFORE INSERT ON FOO REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW 
DECLARE 
NUM1 NUMBER; 
NUM2 NUMBER; 

BEGIN 

    -- some comment 
    if :new.batch_num is null then 
    SELECT COUNT(*) INTO :NEW.BATCH_NUM FROM FOO WHERE CORP_ID = :NEW.CORP_ID; 
    end if; 

    if :new.batch_id is null or :new.batch_id = '' then 
    :NEW.BATCH_ID := :NEW.CORP_ID || '-' || :NEW.BATCH_NUM; 
    end if; 

/* etc... */  

我發現看起來像similar question,但行編號從create or replace...開始,並將我的錯誤行表示爲註釋,我認爲它必須是僞造的。在執行觸發器時拋出錯誤時,如何報告行編號?

+3

Nit:在Oracle中,空字符串等於null。所以'或者:new.batch_id ='''相當於'or:new.batch_id = null',它永遠不會返回true。第一部分':new.batch_id爲空'是你所需要的。 – 2010-06-08 17:22:19

+0

@Shannon:謝謝你的提示!我不能要求所有這些觸發的責任,但我必須承認,這部分可能是我的。也許。 – 2010-06-08 17:28:43

回答

13

行編號(如報告堆棧跟蹤)開始執行Declare是第1行。所以,如果你做到以下幾點:

CREATE OR REPLACE TRIGGER foo 
BEFORE INSERT ON test1 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
DECLARE 
n1 NUMBER := 1; 
n2 NUMBER := 2; 

BEGIN 

    -- a comment 
    IF :new.n1 IS NULL THEN 
    n1 := n2/0; 
    END IF; 
END; 
/

SQL> insert into test1 values (3,'XX','YY',NULL); 

insert into test1 values (3,'XX','YY',NULL) 

ORA-01476: divisor is equal to zero 
ORA-06512: at "XXX.FOO", line 9 
ORA-04088: error during execution of trigger 'XXX.FOO' 

SQL> select line, text from all_source where name = 'FOO'; 

     LINE TEXT 
---------- -------------------------------------------------------------------------------- 
     1 TRIGGER foo 
     2 BEFORE INSERT ON test1 
     3 REFERENCING OLD AS OLD NEW AS NEW 
     4 FOR EACH ROW 
     5 DECLARE 
     6 n1 NUMBER := 1; 
     7 n2 NUMBER := 2; 
     8 
     9 BEGIN 
     10 
     11 -- a comment 
     12 IF :new.n1 IS NULL THEN 
     13  n1 := n2/0; 
     14 END IF; 
     15 END; 

15 rows selected 

你可以看到錯誤被報告爲在發生第9行,這實際上是第13行的來源。

6

行號引用Oracle數據字典中的存儲源。您可以通過檢查數據字典視圖來確定實際行號。

SELECT text 
    FROM all_source 
    WHERE owner = 'MYSCHEMA' 
    AND name = 'FOO_BI' 
    AND type = 'TRIGGER' 
    AND line = 9;