create or replace procedure discount
is --//声明部分
cursor c_group_discount is --声明游标,保存需要打折的课程编号和名称
select distinct c.course_no,c.description --distinct 这里要去重,防止重复打折 。查找满足条件的课程表编号和课程名称
from enrollment e,section s,course c --ENROLLMENT:注册表 SECTION:班级表 COURSE:课程表
where e.section_id =s.section_id --e表里的外键班级编号等于s表里的主键
and s.course_no =c.course_no --班级表里的课程编号外键等于c表里的主键 连接条件就是两个表里的主外键
group by c.course_no,c.description,e.section_id --按照课程编号,课程名称,以及班级编号进行分组,
--因为在不同的班里可能开同一门课,分完组后统计每一组中行的数量
having count(*)>= 8; --做一个三表连接查询来找到哪些课程需要打9.5折
begin --遍历游标,对课程进行打折
for r_discount in c_group_discount loop -- r_discount是一个记录变量名字
update course --其实打折呢就是一个update语句
set cost=cost*0.95
wherecourse_no=r_discount.course_no; --从记录里把课程编号拿出来
dbms_output.put_line('一个5%的折扣给了以下课程:' --每一次都输出下
||r_discount.course_no||' '||r_discount.description);
end loop;
end discount;