2013-05-06 153 views
0

好吧,我正在做一個家庭作業。 我有三張表,電影(標題,年份,長度,流派,演播室名稱,製片人)StarsIn(movieTitle,starName)MovieStar(姓名,地址,性別,出生日期)Oracle觸發器插入/更新

基本上我需要確保何時有人插入或更新星星中的某些內容這些更改還需要在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和我在練觸發器。我知道這可以很容易地使用外鍵完成,但分配是使用觸發器。

我真的可以用一些這方面的幫助。我嘗試了幾百萬種不同的方式來實現這一點,但沒有運氣。

在此先感謝您的任何幫助/建議。

回答

1

我建議爲每一行指定觸發點火。我覺得這很容易。

您可以進行計數以查看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; 
+0

是的,你不知道我有多幸福。我即將開始敲擊我的鍵盤:-)謝謝你。 – mingle 2013-05-06 18:45:46