繁体   English   中英

插入后 Oracle 触发更新值

[英]Oracle trigger update values after insertion

我正在创建一个触发器,但仍然卡住并且不确定代码有什么问题。 任何帮助表示赞赏。

触发器 BI_FILM_DESP 将文本附加到插入数据库的每部新电影的描述中。 输出应该是这样的 [描述].[评级]:最初在 <original_langauge_id> 中。 以 <language_id> 重新发布。 如果评级、语言 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
  • 您可能想阅读触发器。 一个伟大的地方开始就像是一个博客这一块

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM