Oracle 在未按预期操作时插入触发器之前

Oracle 在未按预期操作时插入触发器之前,oracle,triggers,insert,Oracle,Triggers,Insert,我有一张叫做电影的桌子: CREATE TABLE film ( film_id NUMBER(5) NOT NULL, title varchar2(255), description varchar2(255), release_year NUMBER(4) DEFAULT NULL, language_id NUMBER(3) NOT NULL, original_language_id NUMBER(3) DEFAULT NULL, rental_dura

我有一张叫做电影的桌子:

  CREATE TABLE film (
  film_id NUMBER(5) NOT NULL,
  title varchar2(255),
  description varchar2(255),
  release_year NUMBER(4) DEFAULT NULL,
  language_id NUMBER(3) NOT NULL,
  original_language_id NUMBER(3) DEFAULT NULL,
  rental_duration NUMBER(3) DEFAULT 3 NOT NULL,
  rental_rate NUMBER(4,2) DEFAULT '4.99',
  length NUMBER(5) DEFAULT NULL,
  replacement_cost NUMBER(5,2) DEFAULT '19.99' NOT NULL,
  rating varchar2(8) DEFAULT 'G',
  special_features varchar2(255) DEFAULT NULL
  );
我试着做一个触发点,根据电影的特辑(只能有一部)提高电影的租金。我提出了以下触发器(对于oracle,它编译时不会出错)

由于它编译时没有错误,我不知道在哪里查找问题,但它不起作用,因此我使用了一个虚拟示例:

   INSERT INTO FILM VALUES(20001, 'SUPREMO BORROWERS', 'An exasdafaf', 1978, 1, NULL, 5, '2.99', 52, '11.99', 'PG-13', 'Trailers');
在它里面,租金是2.99,当我选择film_id=20001的电影时,租金仍然是2.99

以下是收到的输出: “我的触发器启动了 预告片阅读 新=2.99 新=2.99 我的触发器完成了

插入1行。“

这意味着它知道它有一个预告片,但更新不起作用

有人能帮我理解为什么吗


谢谢:)

这是一个before触发器,您正试图直接更新表中即将插入/更新的行(该行可能还不存在,如果存在,则可能会被实际更新再次覆盖)。不进行表更新,只需更改
new
伪行的值:

:new.RENTAL_RATE := :new.RENTAL_RATE + change;
编辑

根据下面的评论,在这种情况下,上述内容不适用于OP。然而,以下情况确实发生了:

SELECT :new.RENTAL_RATE + change INTO :new.RENTAL_RATE FROM DUAL;

“它不工作”是否未被调用?或者不按预期更新数据?您的“伪示例”是什么?编译失败,第17行(01:50:22)与编译错误相关联的行号与第一个BEGIN语句有关。这只会影响数据库触发器的编译。PL/SQL:ORA-00922:缺少或无效选项编译失败,第17行(01:50:22)与编译错误关联的行号与第一个BEGIN语句相关。这只会影响数据库触发器的编译。PL/SQL:SQL语句ignoredCompilation失败,第18行(01:50:22)与编译错误关联的行号与第一个BEGIN语句相对…奇怪。我的回答基于另一个可能的原因-定义
租金数字(4,2)
变更数字(5,2)
不同。尝试将
更改为(4,2)。最后一个想法是:
选择:new.RENTAL\u RATE+从DUAL更改为:new.RENTAL\u RATE设置:新建租金率:=:新建租金率+变动;不工作,但进入一个:)只是勾选你的答案,谢谢!
SELECT :new.RENTAL_RATE + change INTO :new.RENTAL_RATE FROM DUAL;