Oracle SQL开发人员触发器错误ORA-04088:执行触发器'SYSTEM.LRES_PROTOKOLL'

时间:2019-10-30 10:27:22

标签: oracle plsql database-trigger

我创建一个触发器

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'时发生错误

我找不到有关这意味着什么的链接或解释, 有什么帮助吗?

2 个答案:

答案 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