Oracle sql 开发人员触发器错误 ORA-04088:触发器执行期间出错 'SYSTEM.LRES_PROTOKOLL'
Oracle sql developer trigger error ORA-04088: error during execution of trigger 'SYSTEM.LRES_PROTOKOLL'
我创建了一个触发器
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;
更新语句工作正常,但插入时出现此错误
ORA-01403: no data found ORA-06512: at "SYSTEM.WRITERESPROT", line 76
ORA-06512: at "SYSTEM.LRES_PROTOKOLL", line 38
ORA-04088: error during execution of trigger 'SYSTEM.LRES_PROTOKOLL'
我找不到关于这是什么意思的链接或解释,
有什么帮助吗?
出现此错误是因为您的 SELECT ... INTO ...
查询未返回任何记录。您需要确保查询总是 returns 一条记录,或者处理该异常。
像这样处理异常:
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;
/
问题是没有返回任何行。确保返回 exactly 一行的简单方法是使用聚合:
SELECT MAX(NR)
INTO new_fk1_NR
FROM customers
WHERE :NEW.customer_ID = customers.ID;
聚合查询没有 GROUP BY
returns 恰好一行,即使没有行匹配。如果没有行匹配,则结果为 NULL
.
我创建了一个触发器
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;
更新语句工作正常,但插入时出现此错误
ORA-01403: no data found ORA-06512: at "SYSTEM.WRITERESPROT", line 76 ORA-06512: at "SYSTEM.LRES_PROTOKOLL", line 38 ORA-04088: error during execution of trigger 'SYSTEM.LRES_PROTOKOLL'
我找不到关于这是什么意思的链接或解释, 有什么帮助吗?
出现此错误是因为您的 SELECT ... INTO ...
查询未返回任何记录。您需要确保查询总是 returns 一条记录,或者处理该异常。
像这样处理异常:
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;
/
问题是没有返回任何行。确保返回 exactly 一行的简单方法是使用聚合:
SELECT MAX(NR)
INTO new_fk1_NR
FROM customers
WHERE :NEW.customer_ID = customers.ID;
聚合查询没有 GROUP BY
returns 恰好一行,即使没有行匹配。如果没有行匹配,则结果为 NULL
.