0

わかりましたので、私は宿題に取り組んでいます。私は 3 つのテーブル、映画 (タイトル、年、長さ、ジャンル、studioName、プロデューサー) StarsIn (movieTitle、starName) MovieStar (名前、住所、性別、生年月日) を持っています。

基本的に、誰かが 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

私はオラクルが初めてで、トリガーを練習しています。これは外部キーを使用して簡単に実行できることはわかっていますが、割り当てはトリガーを使用することです。

私は本当にこれでいくつかの助けを使うことができます. 私はこれを実現するために何百万通りもの方法を試しましたが、うまくいきませんでした。

ヘルプ/アドバイスをお寄せいただきありがとうございます。

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 に答える