2013-05-06 4 views
0

Хорошо, поэтому я работаю над домашним заданием. У меня есть три стола, фильмы (название, год, длина, жанр, студия, продюсер) StarsIn (movieTitle, starName) MovieStar (имя, адрес, пол, дата рождения)Oracle Trigger Вставка/обновление

В принципе, мне нужно убедиться, что кто-то вставляет или обновляет что-то в 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 

Я очень новый для оракула и я практикую триггера. Я знаю, что это можно легко сделать с помощью внешних ключей, но назначение - использовать триггеры.

Я мог бы действительно помочь с этим. Я пробовал как миллион различных способов сделать это, не повезло.

Заранее благодарим за помощь/совет.

ответ

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