簡體   English   中英

Oracle觸發器插入/更新

[英]Oracle Trigger Insert/update

好的,所以我正在做作業。 我有三個表,電影(標題,年份,長度,類型,工作室名稱,制片人),StarsIn(電影標題,starName),電影明星(名稱,地址,性別,生日)

基本上,我需要確定何時有人在Stars中插入或更新某些內容在MovieStar中也需要進行這些更改。

到目前為止,我有這樣的事情。

CREATE OR REPLACE TRIGGER testTrig
AFTER UPDATE OR INSERT ON STARSIN
DECLARE
l_name MOVIESTAR.NAME%TYPE;
BEGIN
SELECT NAME FROM MOVIESTAR INTO l_name;
FOR EACH ROW WHEN (new.STARSIN.STARNAME NOT IN l_name)
INSERT INTO MOVIESTAR(NAME) VALUES (new.STARSIN.STARNAME);
END;

我遇到一些編譯器錯誤

Error(4,1): PL/SQL: SQL Statement ignored
Error(4,28): PL/SQL: ORA-00933: SQL command not properly ended
Error(5,10): PLS-00103: Encountered the symbol "ROW" when expecting one of 
the following: in

我對oracle非常陌生,並且正在練習Triggers。 我知道使用外鍵很容易做到這一點,但是分配是使用觸發器。

我真的可以為此提供一些幫助。 我已經嘗試了上百萬種不同的方法來實現這一目標,但是沒有運氣。

在此先感謝您的幫助/咨詢。

我建議為每行指定觸發器觸發。 我發現這些要容易得多。

您可以進行計數以查看MovieStar.Name值是否已經存在,然后插入(如果不存在); 這類似於您上面的方法。 如果另一個用戶在您檢查的時間和插入的時間之間插入了電影明星,這將失敗,但是對於類分配而言,這可能就足夠了。 有公認的不失敗方法,但是您可能尚未在課堂上介紹過它們。

嘗試這樣的事情; 它可能包含您到目前為止在課堂上介紹的所有內容:

CREATE OR REPLACE TRIGGER TestTrig
AFTER UPDATE OR INSERT ON STARSIN
FOR EACH ROW
DECLARE
  movieStarCount NUMBER;
BEGIN
  SELECT COUNT(*) INTO movieStarCount
    FROM MovieStar
    WHERE Name = :NEW.StarName;
  IF movieStarCount = 0 THEN
    INSERT INTO MovieStar (Name) VALUES (:NEW.StarName);
  END IF;
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM