oracle – 怎样从一个触发器的进程中修复这个Mutating表
发布时间:2021-03-22 12:51:50 所属栏目:站长百科 来源:网络整理
导读:此触发器将插入的值转达给进程,该进程将这些值插入另一个表中.我收到了一个变异表错误.我奈何才气办理这个题目? 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; / (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |