代码之家  ›  专栏  ›  技术社区  ›  Sazny14

oracle12c中的审核触发器编译时出错

  •  0
  • Sazny14  · 技术社区  · 7 年前

    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都很完美。请给我们解决错误的方法

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jonathan Willcock    7 年前

    这里似乎还有其他问题。这是一个插入触发器,但您指的是:OLD.e_desc。这是错误的。插入触发器应仅引用:NEW。删除触发器只能引用:OLD,而更新触发器可以同时引用:NEW和:OLDOLD给出了更改前记录的值,但对于INSERT,没有这样的记录。我认为你真正想要的是使用:新的。e\u描述:新建。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有一个字段copyid链接到copy。copyid,它有一个字段链接到客户id。我还假设copy有一个字段链接到书中的b_isbn。根据你的图表,这一定都是真的,只是我不知道字段名。