簡體   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