2017-10-22 22 views
0

私はORACLEを学習していますが、このトリガーを作成しようとするとコンパイルエラーが発生する理由を理解できませんでした。何か助けてくれてありがとう!ORACLEでコンパイルエラーで作成されたトリガー

CREATE OR REPLACE TRIGGER TR_HISTORY 
BEFORE INSERT ON HISTORY 
FOR EACH ROW 
DECLARE name_d varchar2(50), breed_d varchar2(50), area_d varchar2(50) 

BEGIN 
SELECT NAME INTO name_d FROM ANIMALS A WHERE A.ID = :NEW.ID; 
SELECT BREED INTO breed_d FROM ANIMALS A WHERE A.ID = :NEW.ID; 
SELECT AREA INTO area_d FROM STORE S WHERE S.STORE_ID = :NEW.STORE_ID; 

IF (:NEW.DONE ='T') 
THEN 
:NEW.MSG = 'Hi , your animal ' || name_d || ' breed: ' || breed_d || 'is 
at ' || area_d || '.'; 
ELSE 
UPDATE :NEW.MSG = 'Not finished'; 
END IF; 
END; 
/
+0

トリガーには多くの問題があるようです。表示されているエラーメッセージを表示します。また、トリガーで使用したすべての列は表で使用できますか? –

+0

はい、私は変数を使用せず、IF文を単独で実行してもまだエラーが表示されているようです:/ –

+0

私の答えを確認し、INSERT操作中に正しくコンパイルして実行するかどうか教えてください私はあなたのテーブルデータに関する他の問題を知りません。 –

答えて

0

Triggerコード構文にはほとんど問題がありませんでした。

  • 我々は、declareの各式はIF条件のための適切な構文を確認してください ','
  • カンマない後にセミコロン​​3210を使用しています。

  • THEN UPDATE :NEW.MSG =

有効な文ではありません。それは簡単です:NEW.MSG :=

CREATE OR replace TRIGGER tr_history 
    BEFORE INSERT ON history 
    FOR EACH ROW 
DECLARE 
    name_d VARCHAR2(50); 
    breed_d VARCHAR2(50); 
    area_d VARCHAR2(50); 
BEGIN 
    SELECT name 
    INTO name_d 
    FROM animals A 
    WHERE A.id = :NEW.id; 

    SELECT breed 
    INTO breed_d 
    FROM animals A 
    WHERE A.id = :NEW.id; 

    SELECT area 
    INTO area_d 
    FROM store S 
    WHERE S.store_id = :NEW.store_id; 

    IF :NEW.done = 'T' THEN 
     :NEW.msg := 'Hi , your animal ' 
        || name_d 
        || ' breed: ' 
        || breed_d 
        || 'is  at ' 
        || area_d 
        || '.'; 
    ELSE 
     :NEW.msg := 'Not finished'; 
    END IF; 
END; 

/ 
関連する問題