2015-04-05 6 views
0

Я пытаюсь сделать триггер, который обновляет статус класса при обновлении класса или вставки нового. Thats мой столКурсоры в oracle PL/SQL

create table Enrollment (
    Student_ID char(9) not null, 
    Course_ID char(5) not null, 
    Registered_Date date, 
    Grade NUMBER, 
    Status varchar(4), 
    constraint pkEnrollment primary key (Student_ID, Course_ID)); 

Вот мой код до сих пор, и я не знаю, в чем проблема

create or replace TRIGGER PASS_FAIL 
AFTER INSERT OR UPDATE OF GRADE ON ENROLLMENT 
DECLARE 
CURSOR change_grade IS 
select GRADE, STATUS from ENROLLMENT FOR UPDATE; 
newgrade ENROLLMENT.GRADE%type; 
newstatus ENROLLMENT.STATUS%type; 
BEGIN 
    OPEN change_grade; 
    LOOP 
    FETCH change_grade into newgrade,newstatus; 
    IF newgrade>=60 THEN UPDATE ENROLLMENT SET STATUS = 'Pass' WHERE CURRENT OF change_grade; 
    ELSE UPDATE ENROLLMENT SET STATUS = 'Fail' WHERE CURRENT OF change_grade; 
    END IF; 
    EXIT WHEN change_grade%NOTFOUND; 
    END LOOP; 
    CLOSE change_grade; 
END; 

Когда я попытался изменить класс я получить

UPDATE "FELIX"."ENROLLMENT" SET GRADE = '10' WHERE ROWID = 'AAAGETAABAAALKJAAE' AND ORA_ROWSCN = '3332070' 
ORA-04098: trigger 'FELIX.ELIGIBLE_ENROLLMENT' is invalid and failed re-validation 


One error saving changes to table "FELIX"."ENROLLMENT": 
Row 5: ORA-04098: trigger 'FELIX.ELIGIBLE_ENROLLMENT' is invalid and failed re-validation 

Спасибо заранее за помощь

+1

В чем проблема или сообщение об ошибке? – kevinsky

+0

Когда я пытался изменить оценку, я получаю ОБНОВЛЕНИЕ «FELIX». «ENROLLMENT» SET GRADE = '10' WHERE ROWID = 'AAAGETAABAAALKJAAE' И ORA_ROWSCN = '3332070' ORA-04098: триггер FELIX.ELIGIBLE_ENROLLMENT недействителен и не удался повторно проверкой Одна ошибки при сохранении изменений в таблицу «ФЕЛИКС» «РЕГИСТРАЦИЯ»:. Row 5: ORA-04098: триггер «FELIX.ELIGIBLE_ENROLLMENT» является недействительным и не повторной проверкой –

+0

в качестве отправной точки, делает ваш скомпилировать триггер? если нет, то какое сообщение об ошибке? – kevinsky

ответ

1

Ваш код кажется чрезмерно сложным, если точка это узнать о курсорах.

CREATE OR REPLACE TRIGGER PASS_FAIL 
    Before INSERT OR UPDATE 
    ON enrollment 
    REFERENCING NEW AS New OLD AS Old 
    FOR EACH ROW 
DECLARE 
/****************************************************************************** 
    NAME:  PASS_FAIL 
    PURPOSE: 
    USED BY: 
    REVISIONS: 
    Ver  Date  Author   Description 
    --------- ---------- --------------- ------------------------------------ 
    1.0    1. Created this trigger. 

    NOTES: 

******************************************************************************/ 

BEGIN 
    if :new.grade > 60 THEN 
    :new.status := 'PASS'; 
    ELSE 
    :new.status := 'FAIL'; 
    END IF; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     -- Log the error and then re-raise 
     RAISE; 
END PASS_FAIL; 
+0

триггер выше не компилируется. i get Error: ORA-04084: невозможно изменить НОВЫЕ значения для этого типа триггера –

+0

В любом случае выбор из таблицы как части триггера может быть проблематичным. –

+0

так как я могу изменить статус по-другому? –

Смежные вопросы