使用触发器自动更新表中的列

时间:2013-07-08 17:50:04

标签: sql oracle triggers

我遇到触发器代码问题(表突变等等!)我无法找到 是什么问题。

基本上,我有一个表SEMESTER(id_semester,semester_name,begin_date,end_date)。 在插入行时,我希望使用值from更新semester_name 到begin_date中的内容。例如,如果begin_date是'2000-01-01',我想要的值为 semester_name为W00(2000年冬季)。

我的第一次尝试是写一个'after insert'触发器,由于表突变错误而无效。这是:

CREATE TRIGGER Test
BEFORE INSERT ON Semester
FOR EACH ROW

DECLARE
    sem         CHAR(1);
    year        CHAR(2);
BEGIN
    -- begin_date is either 1, 5 or 9.
    IF (EXTRACT(MONTH FROM :new.begin_date) = '1') THEN
        saison := 'W';
    ELSIF (EXTRACT(MONTH FROM :new.begin_date) = '5') THEN
        saison := 'S';
    ELSE
        saison := 'F';
    END IF;

    year := TO_CHAR(:new.date_debut, 'MM');

    UPDATE      Semester
    SET         semester_name = CONCAT(sem, year)
    WHERE       id_semester = :new.id_semester;
END;
/

之后,我尝试制作一个'before insert'触发器,认为它会更好用,但事实并非如此。

有人能指出我正确的方向吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

假设id_semester是主键,而不是UPDATE语句,您只想分配:new.semester_name

:new.semester_name := concat( sem, year );

答案 1 :(得分:0)

只有“每行”类型的触发器才会出现突变表错误,尝试更改“声明”类型的后插入触发器