我试图为学生项目制作简单的触发器。它将在价格表上开火。
CREATE TABLE "STD_USER"."HT_PRICES"
( "PRC_ID" NUMBER,
"PRC_DATE_FROM" DATE,
"PRC_DATE_TO" DATE,
"PRC_STD_ID" NUMBER,
"PRC_AMOUNT" NUMBER
)
触发器的主要目标是检查是否有任何预留没有任何对更新的价格行的引用。
如果任何行实际上有更新行的引用,我们将需要在price表中插入新价格,其开始日期(PRC_DATE_FROM)等于上次预订的结尾。 触发体:
create or replace
TRIGGER "TRG_NEW_PRICE" BEFORE UPDATE ON HT_PRICES
REFERENCING OLD AS old NEW AS new
FOR EACH ROW
DECLARE
v_last_rsv_date DATE;
v_temp_date_to DATE;
v_std_id NUMBER;
v_amount NUMBER;
BEGIN
BEGIN
SELECT MAX(RSV_DATE_TO)
INTO v_last_rsv_date
FROM HT_RESERVATION,
HT_ROOMS,
HT_STANDARDS,
HT_PRICES
WHERE RSV_ROM_ID=ROM_ID
AND ROM_STD_ID=STD_ID
AND STD_ID=:new.PRC_STD_ID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN;
END;
--do skrocenia starej ceny
v_temp_date_to:= :new.PRC_DATE_TO;
--poprawna data dla nowej ceny to v_last_rsv_date
:new.PRC_DATE_TO:= v_last_rsv_date;
v_amount:=:new.PRC_AMOUNT;
:new.PRC_AMOUNT:=:old.PRC_AMOUNT;
v_std_id:=:new.PRC_STD_ID;
:new.PRC_STD_ID:=:old.PRC_STD_ID;
COMMIT;
--skrocenie starej ceny w nowym rekordzie cenowym
HP_MANAGING.ADD_PRICE(v_last_rsv_date, v_temp_date_to, v_std_id, v_amount);
END;
任何想法如何解决?当我试图测试它时,我得到了日志:
在命令的第10行开始出错:
更新HT_PRICES SET PRC_AMOUNT = 501其中prc_id = 1
错误报告:
SQL错误:ORA-04091:表STD_USER.HT_PRICES正在变异,触发器/函数可能看不到它 ORA-06512:at" STD_USER.TRG_NEW_PRICE",第8行
ORA-04088:执行触发器时出错' STD_USER.TRG_NEW_PRICE'
04091. 00000 - "表%s。%s正在变异,触发/功能可能看不到它"
*原因:触发器(或用户定义的plsql函数,在中引用) 这句话)试图查看(或修改)一个表 在被解雇它的声明修改的中间 *动作:重写触发器(或函数),使其不读取该表。
答案 0 :(得分:-1)
1)将SELECT
放入标有pragma autonomous_transaction
的本地程序中,这将允许选择运行,但您不会看到当前事务未提交的更改。
2)COMMIT;
DML触发器中BEFORE
的原因是什么?