Oracle触发器插入/更新

时间:2013-05-06 18:14:30

标签: sql database oracle

好的,我正在做家庭作业。 我有三个表,电影(标题,年份,长度,流派,工作室名称,制片人)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的新手,我正在练习触发器。我知道这可以使用外键轻松完成,但分配是使用触发器。

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

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

1 个答案:

答案 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;
相关问题