加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 如何从一个触发器的过程中修复这个Mutating表

发布时间:2021-03-18 18:14:11 所属栏目:站长百科 来源:网络整理
导读:此触发器将插入的值传递给过程,该过程将这些值插入另一个表中.我收到了一个变异表错误.我怎样才能解决这个问题? CREATE OR REPLACE TRIGGER ADD_INVOICEBEFORE INSERT OR UPDATE OF APP_NO,C_NO ON APPOINTMENTFOR EACH ROWDECLAREBEGINPOP_INVOICE(:NEW.AP

此触发器将插入的值传递给过程,该过程将这些值插入另一个表中.我收到了一个变异表错误.我怎样才能解决这个问题?

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作为参数,无需在查询中包含APPOINTMENT,因此将避免变异表异常.根据每个处理的记录数量,您甚至可以将光标合并到UPDATE语句中.

我认为应该这样做,虽然我无法检查数据库.

CREATE OR REPLACE TRIGGER ADD_INVOICE

BEFORE INSERT OR UPDATE OF APP_NO,:NEW.APP_DATE,:NEW.TRT_NO);

END;
/

修订后的程序:

CREATE OR REPLACE PROCEDURE POP_INVOICE(
I_APP_NO IN INVOICE.APP_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;
/

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读