我想用PLSQL为每个学生成绩增加10分。
UPDATE AverageView SET AverageModifier = 10 WHERE COURSE_ID = 'INFO101' AND GROUP_ID = 101 AND SEMESTER = 'SUMER14';
因此,当我尝试更新视图时,我希望激活此触发器,并且我想使用INSTEAD OF UPDATE并修改实际表。像这样:
CREATE OR REPLACE TRIGGER ChangeAverage
INSTEAD OF UPDATE ON AverageView
FOR EACH ROW
BEGIN
UPDATE INSCRIPTIONS SET grade = (grade + 10) WHERE COURSE_ID = :NEW.COURSE_ID AND GROUP_ID = :NEW.GROUP_ID AND SEMESTER = :NEW.SEMESTER ;
END;
/
我手动添加了+10''但最终它只是一个变量。
UPDATE INSCRIPTIONS SET grade = (grade + modifier) ....
我认为它不起作用,因为有多个等级需要更新,而且我被困在那里。
当我删除成绩并设置静态值时,它“有点”工作,但它将所有学生成绩设置为10。
CREATE OR REPLACE TRIGGER ChangeAverage
INSTEAD OF UPDATE ON AverageView
FOR EACH ROW
BEGIN
UPDATE INSCRIPTIONS SET grade = 10 WHERE COURSE_ID = :NEW.COURSE_ID AND GROUP_ID = :NEW.GROUP_ID AND SEMESTER = :NEW.SEMESTER ;
END;
/
我应该使用循环和光标吗?
我的铭文表如下:
STUDENT_ID CHAR(12) NOT NULL,
COURSE_ID CHAR(12) NOT NULL,
GROUP_ID INTEGER NOT NULL,
SEMESTER CHAR(12) NOT NULL,
REGISTRATION_DATE DATE NOT NULL,
GRADE INTEGER,
我的AverageView是:
CREATE OR REPLACE VIEW AverageView AS
SELECT COURSE_ID, GROUP_ID, SEMESTER, AVG(GRADE) AS Average
FROM Inscriptions
GROUP BY COURSE_ID, GROUP_ID, SEMESTER
/
据我所知,他们无法修改。相反,我修改了铭文表。
让我说我的铭文表看起来像这样
Student A, INFO101, 101, SUMER14, ramdom_date, 70
Student B, INFO101, 101, SUMER14, ramdom_date, 50
我的观点非常有效:本课程平均输出60分。
现在,凭借我的触发器,我想提高平均值。
UPDATE AverageView SET AverageModifier = 10 WHERE COURSE_ID = 'INFO101' AND GROUP_ID = 101 AND SEMESTER = 'SUMER14';
但据我所知,我无法修改视图的内容,因此我想在表格中为每个等级添加10(现在)。
因此触发器会产生类似的结果:
Student A, INFO101, 101, SUMER14, ramdom_date, 80
Student B, INFO101, 101, SUMER14, ramdom_date, 60
祝你好运
答案 0 :(得分:2)
尝试
CREATE OR REPLACE TRIGGER ChangeAverage
INSTEAD OF UPDATE ON AverageView
FOR EACH ROW
BEGIN
UPDATE INSCRIPTIONS SET grade = (:old.grade + 10) WHERE COURSE_ID = :NEW.COURSE_ID AND GROUP_ID = :NEW.GROUP_ID AND SEMESTER = :NEW.SEMESTER ;
END;
/
答案 1 :(得分:0)
原来我有一个没有更新的约束,并且阻止我在某些参数内更新。我想我们可以删除这个问题!