-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 データが更新されません。この問題を解決できません。助けてください。ありがとうございます。

ほぼ半日を理解しようとしましたが、この問題を解決できませんでした。私はOracle SQLを初めて使用します。

4

1 に答える 1

1

トリガーには、「変更トリガー」エラーを引き起こすコードが含まれています。詳細を表示するには、「ora-04091」を Google で検索してください (ここに 1 つのリンクがあります)。基本的に、トリガーでコンテキストが現在更新されているテーブルをクエリすることはできません。あなたの場合、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;

そのため、最初の選択の目的が何であったかさえわかりません。外すだけでOKです。

于 2013-07-15T00:45:54.540 に答える