Как нумерация строк работает в триггере Oracle?

У меня есть триггер, это бросает ошибку, и я не уверен, как знать, какая строка МН / кода SQL бросает ту ошибку. Моя ошибка

[Oracle] РТЫ 01403: никакие данные не нашли РТЫ 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... */     

Я нашел то, что похоже на подобный вопрос, но нумерация строк запускается с create or replace... и представляет мою ошибочную строку как комментарий, который я думаю, должно быть поддельным. Как о нумерации строк сообщают, когда ошибка брошена в выполнение триггера?

6
задан Community 23 May 2017 в 10:10
поделиться

2 ответа

Нумерация строк (как сообщается в трассировках стека) начинается с 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 в исходном тексте.

15
ответ дан 8 December 2019 в 05:53
поделиться

Номера строк относятся к сохраненному источнику в словаре данных Oracle. Вы можете определить фактическую нумерацию строк, проверив просмотры словаря данных.

SELECT text
  FROM all_source
  WHERE owner = 'MYSCHEMA'
    AND name = 'FOO_BI'
    AND type = 'TRIGGER'
    AND line = 9;
7
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: