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.