好的,我正在做家庭作业。 我有三个表,电影(标题,年份,长度,流派,工作室名称,制片人)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的新手,我正在练习触发器。我知道这可以使用外键轻松完成,但分配是使用触发器。
我真的可以使用一些帮助。我已经尝试过百万种不同的方法来实现这一目标,但没有运气。
提前感谢您的任何帮助/建议。
答案 0 :(得分: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;