我想用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,
我的平均浏览量是:
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
向致以最良好的问候
尝试
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;
/
原来我有一个约束没有更新,并且阻止我在某些参数内更新。我想我们可以删除这个问题!