【问题标题】:Oracle trigger update values after insertion插入后Oracle触发更新值
【发布时间】:2021-10-21 13:24:42
【问题描述】:

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

触发器 BI_FILM_DESP 将文本附加到插入到数据库中的每个新电影的描述中。 输出应该是这样的 [description].[rating] :最初在 中。以 重新发布。 如果等级、语言 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;
/

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    触发器不是这样工作的。无法在创建触发器的表上执行 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
    • 您可能需要阅读触发器。一个很好的起点是像 this one 这样的博客。

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2019-07-28
      • 2012-03-30
      • 2013-07-01
      • 2021-03-08
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多