2013-07-14 32 views
-1
CREATE OR REPLACE TRIGGER TGR_UPT_CGPA 
AFTER INSERT ON onlineAssessment 
FOR EACH ROW 
DECLARE 
    v_totalCredit NUMBER(3):=0; 
    v_learnerID VARCHAR(15); 
    v_grade onlineAssessment.grade%TYPE; 
    v_gradeNum NUMBER(2); 

    CURSOR Grade_CURSOR IS 
     SELECT COUNT(grade), grade 
     FROM onlineAssessment 
     WHERE learnerID = :new.learnerID GROUP BY grade; 

BEGIN 
    SELECT learnerID into v_learnerID 
    FROM onlineAssessment 
    WHERE AssessmentID = :new.AssessmentID; 

    SELECT SUM(C.courseCredits) into v_totalCredit 
    FROM Courses C, onlineAssessment A 
    WHERE A.learnerID = :new.learnerID AND C.CourseID = A.CourseID; 

    OPEN Grade_CURSOR; 

    LOOP 
    FETCH Grade_CURSOR INTO v_gradeNum, v_grade; 
    EXIT WHEN Grade_CURSOR%NOTFOUND; 
    IF v_grade='A' THEN 
     v_totalCredit := v_totalCredit+(v_gradeNum*4); 
    ELSIF v_grade='B' THEN 
     v_totalCredit := v_totalCredit+(v_gradeNum*3); 
    ELSIF v_grade='C' THEN 
     v_totalCredit := v_totalCredit+(v_gradeNum*2); 
    ELSIF v_grade='D' THEN 
     v_totalCredit := v_totalCredit+(v_gradeNum*2); 
    ELSE 
     v_totalCredit := v_totalCredit+(v_gradeNum*0); 
    END IF; 
    END LOOP; 
    CLOSE Grade_CURSOR; 

    UPDATE learners 
    SET CGPA = v_totalCredit 
    WHERE learnerID = :new.learnerID; 


END; 
/

触发,但是当我把新数据插入onlineAssessment表,它不会更新学习者的CGPA data..I解决不了这个provle,请帮帮我,谢谢。触发帮助 - 无法触发没有问题创造

我试图找出差不多半天,我无法解决这个问题。我是oracle SQL新手。

+3

嗨,发布时请始终包含您收到的错误,我认为这是一个变异表错误?你能用英语解释一下你正在努力做什么吗? – Ben

+0

什么是错误,以及在哪一行?我们不介意读者。 – OldProgrammer

回答

1

您的触发器中含有会导致“突变触发器”错误的代码。谷歌“ora-04091”查看详情(这里是一个link)。基本上,您无法查询其上下文当前正在触发器中更新的表。你的情况,你有onlineAssessment触发,但在代码中,你有这样的选择:

SELECT learnerID into v_learnerID 
    FROM onlineAssessment 
    WHERE AssessmentID = :new.AssessmentID; 

您需要删除的选择,并且简单地引用:new.learnerID。您已经引用在接下来的查询:

SELECT SUM(C.courseCredits) into v_totalCredit 
    FROM Courses C, onlineAssessment A 
    WHERE A.learnerID = :new.learnerID AND C.CourseID = A.CourseID; 

,所以我甚至不知道什么是第一次的目的是选择。只要删除它,你应该没问题。