2017-07-29 74 views
0

refer my ER審計觸發器與書中表格計算錯誤

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; 
    /

編譯給出,但評價,速率應該由客戶來定,如果客戶給出的利率爲空值以下觸發器應該工作。但是我們收到一個錯誤,表示語句被忽略,表或視圖不存在。我檢查了兩次或更多,但所有的表名和ID都是完美的。請給我們解決方案,以解決錯誤

+0

可能SELECT TOWN INTO v_location FROM COPY WHERE B_ISBN = v_isbn;是問題嗎?在其他地方,你使用的是x_風格的前綴,但出於某種原因,你不適用於TOWN和COPY。另外你的插入有位置和評估沒有前綴 –

+0

真棒喬納森,我犯了一個錯誤的表名。我們已經修復了它,非常感謝,觸發器編譯沒有錯誤,但是當我們嘗試給出空值評估時,我們得到一個錯誤,說'確切的讀取返回的行數多於請求的行數','執行期間的錯誤'EVA''的觸發器,所以我不知道如何解決這個問題,如果你能幫助我,我會很高興 – Sazny14

+0

我已經添加了答案 –

回答

0

在這裏別的東西看起來不對。這是一個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 

什麼我假設這裏是借給有一個字段copyid鏈接到copy.copyid,它有一個字段鏈接到客戶ID。我還假設副本有一個字段鏈接到書中的b_isbn。根據你的圖表,這一定是真實的,只是我不知道字段名稱。

+0

是的,這是正確的,但即使我們已經完成了改變,我們得到了同樣的錯誤說 '取多行'。:-( – Sazny14

+0

INSERT INTO c_evaluation( e_desc, b_isbn, C_ID, R_ID )VALUES( '好書', 14002, 29 , null ) 錯誤報告 - ORA-01422:精確提取返回的請求數超過要求的行數 ORA-06512:在「OPS $ 1629266.EVA」,第14行 ORA-04088:執行觸發器'EVA'期間出錯 – Sazny14

+0

您可以編輯你的問題與修改過的代碼一起,以便我可以檢查是否還有其他錯誤,請嗎? –