Oracle 表正在变异,触发器可能看不到它
创建触发器时没有错误。但是当我启动它时,一条错误消息显示表正在发生变化。我如何解决这个表变异的问题Oracle 表正在变异,触发器可能看不到它,oracle,plsql,triggers,database-trigger,Oracle,Plsql,Triggers,Database Trigger,创建触发器时没有错误。但是当我启动它时,一条错误消息显示表正在发生变化。我如何解决这个表变异的问题 CREATE OR REPLACE TRIGGER tgr_invoice AFTER UPDATE OF discharge_date ON Admission FOR EACH ROW DECLARE doc_fee NUMBER(5); nights_stayed NUMBER(4); room_price NUMBER(5); room_fee NUMBER(9); med_fee NUM
CREATE OR REPLACE TRIGGER tgr_invoice
AFTER UPDATE OF discharge_date
ON Admission
FOR EACH ROW
DECLARE
doc_fee NUMBER(5);
nights_stayed NUMBER(4);
room_price NUMBER(5);
room_fee NUMBER(9);
med_fee NUMBER(7, 2);
units_prescribed NUMBER(3);
price_per_unit NUMBER(7, 2);
total_fee NUMBER(8,2);
BEGIN
SELECT consult_fee INTO doc_fee
FROM Doctor
WHERE staff_id IN (SELECT seen_by FROM Admission
WHERE patient_id = :NEW.patient_id
AND admission_date = :NEW.admission_date);
SELECT (discharge_date - admission_date) INTO nights_stayed
FROM Admission
WHERE patient_id = :NEW.patient_id
AND admission_date = :NEW.admission_date;
SELECT room_price INTO room_price
FROM Room
WHERE room_no IN (SELECT room_no FROM Admission
WHERE patient_id = :NEW.patient_id
AND admission_date = :NEW.admission_date);
SELECT units_prescribed INTO units_prescribed
FROM Prescription
WHERE patient_id = :NEW.patient_id
AND prescription_date = :NEW.admission_date;
SELECT price_per_unit INTO price_per_unit
FROM Medicine
WHERE med_id IN (SELECT med_id FROM Prescription
WHERE patient_id = :NEW.patient_id
AND prescription_date = :NEW.Admission_date);
room_fee := room_price * nights_stayed;
med_fee := units_prescribed * price_per_unit;
total_fee := room_fee + doc_fee + med_fee;
INSERT INTO Invoice VALUES(seq_inv_no.NEXTVAL, :NEW.patient_id,
:NEW.admission_date, doc_fee, room_fee, med_fee, total_fee);
END;
/
当我更新入院表并输入出院日期时,出现了一个错误“表系统。入院正在发生变化,触发器/函数可能看不到它“我认为更合适的做法是,在创建DB触发器的表列的:新值或:旧值之间进行操作,从而从赋值中派生值,而不是使用SELECT语句作为行级触发器。因此,考虑使用下面的代码块:
CREATE OR REPLACE TRIGGER tgr_invoice AFTER UPDATE OF discharge_date ON Admission
FOR EACH ROW
DECLARE
doc_fee NUMBER(5);
nights_stayed NUMBER(4);
room_price NUMBER(5);
room_fee NUMBER(9);
med_fee NUMBER(7, 2);
units_prescribed NUMBER(3);
price_per_unit NUMBER(7, 2);
total_fee NUMBER(8,2);
BEGIN
SELECT consult_fee
INTO doc_fee
FROM Doctor
WHERE staff_id = :NEW.seen_by;
nights_stayed := :NEW.discharge_date - :NEW.admission_date;
SELECT room_price
INTO room_price
FROM Room
WHERE room_no = :NEW.room_no;
SELECT units_prescribed
INTO units_prescribed
FROM Prescription
WHERE patient_id = :NEW.patient_id
AND prescription_date = :NEW.admission_date;
SELECT price_per_unit INTO price_per_unit
FROM Medicine
WHERE med_id IN (SELECT med_id
FROM Prescription
WHERE patient_id = :NEW.patient_id
AND prescription_date = :NEW.Admission_date);
room_fee := room_price * nights_stayed;
med_fee := units_prescribed * price_per_unit;
total_fee := room_fee + doc_fee + med_fee;
INSERT INTO Invoice
VALUES(seq_inv_no.NEXTVAL, :NEW.patient_id, :NEW.admission_date,
doc_fee, room_fee, med_fee, total_fee);
END;
/
如果您描述了您试图实现的逻辑,这会有所帮助。示例数据和所需结果有帮助。您不应在
系统
(或任何其他Oracle系统架构)中创建任何用户表或其他对象。为你的应用程序创建一个用户并在那里创建你的对象。非常感谢你的帮助,我非常感谢。