Oracle 如何从一个过程或触发器修复这个变异表

Oracle 如何从一个过程或触发器修复这个变异表,oracle,plsql,triggers,mutating-table,Oracle,Plsql,Triggers,Mutating Table,此触发器将把插入的值传递给将在另一个表中插入这些值的过程。我得到一个变异表错误。我怎样才能解决这个问题 CREATE OR REPLACE TRIGGER ADD_INVOICE BEFORE INSERT OR UPDATE OF APP_NO,C_NO ON APPOINTMENT FOR EACH ROW DECLARE BEGIN POP_INVOICE(:NEW.APP_NO,:NEW.C_NO,:NEW.APP_DATE); END; / CREATE OR REPLACE P

此触发器将把插入的值传递给将在另一个表中插入这些值的过程。我得到一个变异表错误。我怎样才能解决这个问题

CREATE OR REPLACE TRIGGER ADD_INVOICE
BEFORE INSERT OR UPDATE OF APP_NO,C_NO ON APPOINTMENT
FOR EACH ROW
DECLARE
BEGIN

POP_INVOICE(:NEW.APP_NO,:NEW.C_NO,:NEW.APP_DATE);

END;
/

CREATE OR REPLACE PROCEDURE POP_INVOICE(
I_APP_NO IN INVOICE.APP_NO%TYPE,
I_C_NO IN INVOICE.C_NO%TYPE,
I_INV_DATE IN INVOICE.INV_DATE%TYPE)
AS
CURSOR C_POP IS SELECT PRICE FROM TREATMENT T,APPOINTMENT A 
WHERE T.TRT_NO=A.TRT_NO
AND A.APP_NO=I_APP_NO;

V_BILL INVOICE.BILL%TYPE;
BEGIN

OPEN C_POP; 
FETCH C_POP INTO V_BILL;

UPDATE INVOICE
SET INV_NO=INV_IDSEQ.NEXTVAL,
APP_NO=I_APP_NO,
C_NO=I_C_NO,
BILL=V_BILL,
INV_DATE=I_INV_DATE;

END;
/

该问题是由于在触发器本身中引用带有触发器的表而引起的。将过程更改为接受TRT_NO作为参数,将不需要在查询中包含约会,因此将避免变异表异常。根据每个处理有多少条记录,您甚至可以将游标合并到UPDATE语句中

我认为这应该可以做到,尽管我还不能对照数据库进行检查

CREATE OR REPLACE TRIGGER ADD_INVOICE

BEFORE INSERT OR UPDATE OF APP_NO,C_NO ON APPOINTMENT
FOR EACH ROW
DECLARE
BEGIN

POP_INVOICE(:NEW.APP_NO,:NEW.C_NO,:NEW.APP_DATE,:NEW.TRT_NO);

END;
/
经修订的程序:

CREATE OR REPLACE PROCEDURE POP_INVOICE(
I_APP_NO IN INVOICE.APP_NO%TYPE,
I_C_NO IN INVOICE.C_NO%TYPE,
I_INV_DATE IN INVOICE.INV_DATE%TYPE,
I_TRT_NO IN APPOINTMENT.TRT_NO%TYPE
)
AS

CURSOR C_POP IS SELECT PRICE 
FROM TREATMENT T
WHERE T.TRT_NO = I_TRT_NO;

V_BILL INVOICE.BILL%TYPE;

BEGIN

OPEN C_POP; 
FETCH C_POP INTO V_BILL;
CLOSE C_POP;

INSERT INVOICE
  (inv_no, app_no, c_no, bill, inv_date)
VALUES
  (INV_IDSEQ.NEXTVAL, I_APP_NO, I_C_NO, V_BILL, I_INV_DATE);


END;
/

另一方面,您的UPDATE语句将更新发票表中的每一行。我想您需要的是INSERT语句,而不是更新。我冒昧地将更新更正为INSERT,因为更新毫无意义。非常感谢您的帮助