在oracle中插入触发器内部

时间:2017-03-19 17:30:12

标签: oracle oracle11g triggers

我试图为学生项目制作简单的触发器。它将在价格表上开火。

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函数,在中引用)              这句话)试图查看(或修改)一个表              在被解雇它的声明修改的中间   *动作:重写触发器(或函数),使其不读取该表。

1 个答案:

答案 0 :(得分:-1)

1)将SELECT放入标有pragma autonomous_transaction的本地程序中,这将允许选择运行,但您不会看到当前事务未提交的更改。

2)COMMIT; DML触发器中BEFORE的原因是什么?