带有聚合函数的PL / SQL触发器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有聚合函数的PL / SQL触发器相关的知识,希望对你有一定的参考价值。

我有一个触发器,它使用avg()函数根据course表中的课程分数来计算学生的gpa。

这里的问题是,当我的触发器执行时,表中的GPA参数为空。

谁能看到这个问题?

drop table courses;
drop table student;
drop table assignments;

create table student (sid integer, sname char(10), saddress char(10), gpa integer);
create table courses (sid integer, cid integer, cgrade integer);
create table assignments ( sid integer, cid integer, aid integer, agrade integer);


create or replace trigger updategpa before insert or update of cgrade on courses for each row
    begin
        if inserting then
            update student set gpa = (select avg(cgrade) from courses where courses.sid = student.sid) where sid = :new.sid;
        elsif inserting then
            update student set gpa = (select avg(cgrade) from courses where courses.sid = student.sid) where sid = :new.sid;
        elsif deleting then
            delete from student where sid = :new.sid;
        end if;
    end;
/
show errors;


insert into student (sid, sname, saddress, gpa) values (1, 'Mike', 'Brighton', 0);
insert into courses (sid, cid, cgrade) values(1, 2550, 0);
insert into assignments values(1, 2550, 1, 70);
insert into assignments values(1, 2550, 2, 80);

select * from courses;
select * from student;
select * from assignments;

update assignments set agrade = agrade + 5;

select * from courses;
select * from student;
select * from assignments;
答案

根据知识,您的触发器似乎是正确的。但是如果你仔细看看你的插入语句。你正在插入insert into courses (sid, cid, cgrade) values(1, 2550, 0);这里cgrade的值是0.所以很明显avg(0)是0并且将gpa更新为0.如果你插入几个值,你肯定会在学生表格中以gpa更新avg(CGRADE)。

尝试更多插入来检查像insert into courses (sid, cid, cgrade) values(1, 2551, 10); insert into courses (sid, cid, cgrade) values(1, 2551, 15); insert into courses (sid, cid, cgrade) values(1, 2551, 20);

你肯定会得到结果:

1 Mike Brighton 8

以上是关于带有聚合函数的PL / SQL触发器的主要内容,如果未能解决你的问题,请参考以下文章

(十七)PL/SQL DBMS输出

pl/sql基础练习

PLS-00653 空行错误(PL/SQL 范围内不允许聚合/表函数)

pl/sql编程基础

在 PL/SQL 中的触发器内调用函数

为啥我的 PL/SQL 触发器会引发“错误(2,2):PL/SQL:语句被忽略”和“错误(2,5):PLS-00204:函数或伪列'EXISTS'”错误?