繁体   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