CREATE OR REPLACE TRIGGER EVA
AFTER INSERT ON C_EVALUATION
FOR EACH ROW
DECLARE
v_cid number(25);
v_isbn number(25);
v_cname VARCHAR2(50);
v_tittle VARCHAR2(150);
v_date date;
v_location VARCHAR2(50);
v_eva VARCHAR2(250);
BEGIN
v_cid:=:OLD.C_ID;
v_isbn:=:OLD.B_ISBN;
v_eva:=:OLD.e_desc;
SELECT C_NAME INTO v_cname FROM C_CUSTOMER WHERE C_ID = v_cid;
select l_date INTO v_date FROM C_LEND where c_id = v_cid;
select B_TITTLE INTO v_tittle FROM C_BOOK WHERE B_ISBN = v_isbn;
SELECT TOWN INTO v_location FROM COPY WHERE B_ISBN = v_isbn;
IF :NEW.R_ID IS NULL
THEN
INSERT INTO e_audit (
c_name,
b_tittle,
h_date,
location,
evaluation
) VALUES (
v_cname,
v_tittle,
v_date,
v_location,
v_eva
);
END IF;
END;
/
ブックテーブルでは評価が与えられますが、評価、レートは顧客が与える必要があります。顧客がレートをnull値として与える場合、以下のトリガーが機能するはずです。しかし、ステートメントが無視されたため、テーブルまたはビューが存在しないというエラーが発生します。2回以上チェックしましたが、テーブル名とIDはすべて完璧です。エラーを解決するための解決策を教えてください
ここで他の何かが間違っているように見えます。これはINSERTトリガーですが、:OLD.e_descを参照しています。これは間違っています。INSERTトリガーは:NEWのみを参照する必要があります。DELETEトリガーは:OLDのみを参照する必要がありますが、UPDATEトリガーは:NEWと:OLDの両方を参照できます。:OLDは、変更前のレコードの値を示しますが、INSERTの場合、そのようなレコードはありませんでした。本当に必要なのは、:NEW.e_desc、:NEW.c_id、および:NEW.b_isbnを使用することだと思います。しかし、私は少し推測しています!
編集
あなたの図はすべてのフィールドを示していませんか?しかし、私があなたに必要だと思うのは:
SELECT TOWN into v_location FROM copy inner join lend
ON lend.copyid = copy.copyid WHERE b_isbn = v_isbn
AND lend.c_id = v_cid
ここで私が想定しているのは、lendにはcopy.copyidにリンクするフィールドcopyidがあり、顧客IDにリンクするフィールドがあるということです。また、コピーには本のb_isbnにリンクするフィールドがあると想定しています。あなたの図によると、これはすべて真実でなければなりません、それは私がフィールド名を知らないということだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加