使用PLSQL为列中的每个元素添加相同的值



我想用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;
/

原来我有一个约束没有更新,并且阻止我在某些参数内更新。我想我们可以删除这个问题!

最新更新