2016-11-24 14 views
-2

コンパイルエラー(テーブルまたはビューが存在しない)で作成したトリガー以下のように、それは私を示していますOracle12c:私は次のようにトリガーを作成しよう

2/5 PL/SQL: SQL Statement ignored 
2/71 PL/SQL: ORA-00942: table or view does not exist 

私はここにテーブルが学校を意味推測するが、私はそのテーブルschool exists.Whereが問題であるであると確信している私にhand.Thanksを教えてください?!

次のように私は、コードを変更した:

CREATE OR REPLACE TRIGGER update_student 
AFTER UPDATE OF school ON student FOR EACH ROW 
BEGIN 
    UPDATE :new.school SET num2=num2+1 WHERE school.id=(SELECT :new.school FROM inserted); 
END; 
/

しかし、新しいエラーoccurred.Itは示しています

2/5  PL/SQL: SQL Statement ignored 
2/24  PL/SQL: ORA-00903: invalid table name 

は、どのように私はそれを修正することができますおかげで?!

+0

これはなんですか? '(SELECT school FROM inserted)' - おそらくSQL Server構文のように見えますか? Oracleでは動作しません。代わりに ':new.school'を使用してください –

+0

@ TonyAndrewsありがとうございます!しかし、新しい問題が発生しました。私は質問に追加しました。私を助けることができますか?ありがとうございます! – dapao

答えて

0

トリガーでは、新しいフィールド値と古いフィールド値にアクセスするために:NEWと:OLD疑似行を使用する必要があります。そのように、あなたのUPDATE文は次のようになります。

UPDATE school 
    SET num2 = num2 + 1 
    WHERE school.id = :NEW.SCHOOL; 

ます。また、古い学校の生徒の数を減少することがあります:

UPDATE SCHOOL 
    SET NUM2 = NUM2 - 1 
    WHERE SCHOOL.ID = :OLD.SCHOOL; 

そして、あなたはおそらく場合SCHOOL行を更新しようとすることは避けてくださいSTUDENT.SCHOOL(旧バージョンまたは新バージョンのいずれか)はNULLです。

CREATE OR REPLACE TRIGGER UPDATE_STUDENT 
    AFTER UPDATE OF SCHOOL ON STUDENT 
    FOR EACH ROW 
BEGIN 
    IF :NEW.SCHOOL IS NOT NULL THEN 
    UPDATE SCHOOL 
     SET NUM2 = NUM2 + 1 
     WHERE SCHOOL.ID = :NEW.SCHOOL; 
    END IF; 

    IF :OLD.SCHOOL IS NOT NULL THEN 
    UPDATE SCHOOL 
     SET NUM2 = NUM2 - 1 
     WHERE SCHOOL.ID = :OLD.SCHOOL; 
    END IF; 
END UPDATE_STUDENT; 

最高の運があります。

+0

ご協力ありがとうございます!私の不注意が問題につながったことは残念です – dapao

関連する問題