我创建一个触发器
create or replace TRIGGER trj2
BEFORE INSERT OR UPDATE OF
customer_ID ON Reserve
FOR EACH ROW
DECLARE
new_fk1_NR VARCHAR2(7);
BEGIN
SELECT NR
INTO new_fk1_NR
FROM customers
WHERE :NEW.customer_ID= customers.ID;
:NEW.NR_K := new_fk1_NR;
END;
对于update语句,它工作正常,但对于插入它,则会出现此错误
ORA-01403:找不到数据ORA-06512:在“ SYSTEM.WRITERESPROT”的第76行 ORA-06512:位于“ SYSTEM.LRES_PROTOKOLL”的第38行 ORA-04088:执行触发器'SYSTEM.LRES_PROTOKOLL'时发生错误
我找不到有关这意味着什么的链接或解释, 有什么帮助吗?
答案 0 :(得分:1)
由于您的SELECT ... INTO ...
查询未返回任何记录,因此引发了此错误。您需要确保查询始终返回一条记录,或处理该异常。
类似这样的东西将处理异常:
create or replace trigger trj2
before insert or update of customer_id on reserve
for each row
declare
new_fk1_nr varchar2(7);
begin
select nr into new_fk1_nr from customers where :new.customer_id= customers.id;
:new.nr_k := new_fk1_nr;
exception
when NO_DATA_FOUND
then raise_application_error(
-20010,
'this could not happen since customer does not exist'
);
when others
then raise_application_error(-20011,'Unknown Exception');
end;
/
答案 1 :(得分:1)
问题是没有行返回时。确保准确返回 一行的一种简单方法是使用聚合:
SELECT MAX(NR)
INTO new_fk1_NR
FROM customers
WHERE :NEW.customer_ID = customers.ID;
即使没有行匹配,没有GROUP BY
的聚合查询也只返回一行。如果没有匹配的行,则结果为NULL
。