代码之家  ›  专栏  ›  技术社区  ›  Chris Farmer Marcelo Cantos

Oracle触发器中的行号是如何工作的?

  •  5
  • Chris Farmer Marcelo Cantos  · 技术社区  · 15 年前

    [Oracle]ORA-01403:未找到数据 ORA-06512:在

    我的触发器是这样的:

    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...

    2 回复  |  直到 8 年前
        1
  •  16
  •   DCookie    15 年前

    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行。

        2
  •  7
  •   Dave Costa    15 年前

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