2016-08-20 32 views
0
CREATE TABLE STUDENTS_1 
(
NAME VARCHAR2(50)NOT NULL, 
DIV VARCHAR2(5) CHECK (DIV IN ('E','F','G')), 
MARKS NUMBER CHECK (MARKS <= 600), 
GRADE VARCHAR2(5) CHECK (GRADE IN ('A','B','C')) 
) 

CREATE OR REPLACE TRIGGER MARKS 
BEFORE INSERT OR UPDATE ON STUDENTS_1 
FOR EACH ROW 


BEGIN 

IF (:NEW.MARKS>500)THEN 
INSERT INTO STUDENTS_1(MARKS,GRADE)VALUES(:NEW.MARKS,'A'); 

ELSIF (:NEW.MARKS>400 AND:NEW.MARKS<500) THEN 
INSERT INTO STUDENTS_1(MARKS,GRADE)VALUES(:NEW.MARKS,'B'); 

ELSE (:NEW.MARKS <400) 
INSERT INTO STUDENTS_1(MARKS,GRADE)VALUES(:NEW.MARKS,'C'); 


END IF ; 
END;/ 

我会插入标记到这个表,我想触发相应触发级到同一个表就什么标志着我正在进入和我”当我这样做时,我得到not enough values error 所以我想知道我在做什么可能还是有另一种方式?在同一表中插入触发插入后

回答

3

这种方法有几个问题。首先,如果您可以在students_1的插入触发器中插入students_1,您将创建一个无限循环。你会做一个插入,触发触发器,这将做一个插入,这将触发的触发器,这将做一个插入,这将触发触发器......其次,你可能想要设置当前值grade值行,不会创建新的行。 grade可能与您正在插入的行的mark有关。

你可能只是想在:new pseudorecord

FOR EACH ROW 
BEGIN 
    case when :new.marks < 400 
     then :new.grade := 'C'; 
     when :new.marks between 400 and 500 
     then :new.grade := 'B'; 
     when :new.marks > 500 
     then :new.grade := 'A'; 
    end case; 
END; 

更新grade如果这是一个真正的问题,而不是一个需要触发一个家庭作业,你可能要为grade一个虚拟列,其中包括计算而不是写一个触发器来维护一个计算列。

+0

“如果这是一个真正的问题,而不是家庭作业” - 我当然希望我们看到的有关班级,年级等的问题是现实世界的问题,因为如果他们是我认为我们可以合理地得出结论:教育机构正在聘请很多开发人员,他们提出了许多初级问题,因此可能会向雇主提供低于恒星级的应用程序。这让我认为有充足的设计和书面的课堂/学生/年级软件的巨大市场机会! '打扰我 - 我得走了...... :-) –