插入后Oracle触发更新值



我正在创建一个触发器,但仍然卡住,不知道什么是错误的代码。如有任何帮助,不胜感激。

触发器BI_FILM_DESP将文本附加到插入数据库的每个新电影的描述中。输出应该是这样的[description]。[评级]:原产于重新发布如果分级、语言id或原始语言为空,电影将使用原始描述。

CREATE OR REPLACE TRIGGER "BI_FILM_DESP"
AFTER INSERT ON "FILM"
FOR EACH ROW
DECLARE
DESCRIPTION VARCHAR2 (255);
BEGIN
INSERT INTO FILM
(TITLE, DESCRIPTION, LANGUAGE_ID, ORIGINAL_LANGUAGE_ID, RATING) VALUES (:new.TITLE, :new.DESCRIPTION, :new.LANGUAGE_ID, :new.ORIGINAL_LANGUAGE_ID, :new.RATING)
UPDATE FILM 
SET DESCRIPTION = DESCRIPTION '. '  RATING  ': Originally in '  LANGUAGE_ID  '. RE-released in '  ORIGINAL_LANGUAGE_ID
WHERE RATING IS NOT NULL
OR LANGUAGE_ID IS NOT NULL
OR ORIGINAL_LANGUAGE_ID IS NOT NULL;
END;
/

这不是触发器的工作原理。不能在创建触发器的表上使用DML语句。不如这样做:

CREATE OR REPLACE TRIGGER "BI_FILM_DESP" BEFORE
INSERT ON "FILM"
FOR EACH ROW
DECLARE
l_description VARCHAR2(255);
BEGIN
IF ( :new.rating IS NOT NULL OR :new.language_id IS NOT NULL OR :new.original_language_id IS NOT NULL ) THEN
:new.description := :new.description
|| '. '
|| :new.rating
|| ': Originally in '
|| :new.language_id
|| '. RE-released in '
|| :new.original_language_id;
END IF;
END;
/
  • 一个BEFORE INSERT触发器是你想要的,因为你在插入
  • 之前修改列
  • 这个功能不需要触发器。使用虚拟列可以实现相同的功能。
  • 在oracle中是通过||符号完成的。
  • 为变量添加前缀是有意义的。与表的列同名的变量正在询问问题。我将description重命名为l_description
  • 你可能需要阅读触发器。像这样的博客是一个很好的开始。

最新更新