0

好的,所以我正在做家庭作业。我有三个表, Movies(标题、年份、长度、流派、工作室名称、制片人) StarsIn(movieTitle、starName) MovieStar(姓名、地址、性别、出生日期)

基本上我需要确保当有人在 StarsIn 中插入或更新某些内容时,这些更改也需要在 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 很陌生,我正在练习触发器。我知道这可以使用外键轻松完成,但分配是使用触发器。

我真的可以在这方面使用一些帮助。我已经尝试了一百万种不同的方法来实现这一点,但没有运气。

提前感谢您的任何帮助/建议。

4

1 回答 1

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;
于 2013-05-06T18:27:00.853 回答