У меня есть триггер, это бросает ошибку, и я не уверен, как знать, какая строка МН / кода 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...
и представляет мою ошибочную строку как комментарий, который я думаю, должно быть поддельным. Как о нумерации строк сообщают, когда ошибка брошена в выполнение триггера?
Нумерация строк (как сообщается в трассировках стека) начинается с 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 в исходном тексте.
Номера строк относятся к сохраненному источнику в словаре данных Oracle. Вы можете определить фактическую нумерацию строк, проверив просмотры словаря данных.
SELECT text
FROM all_source
WHERE owner = 'MYSCHEMA'
AND name = 'FOO_BI'
AND type = 'TRIGGER'
AND line = 9;