2017-07-29 73 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

您可以编辑你的问题与修改过的代码一起,以便我可以检查是否还有其他错误,请吗? –