资源描述:
《实验六:存储过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、题目:实验六PL/SQL姓名Vivian日期2006-1-1实验内容及完成情况:实验环境介绍:硬件:CPU:P3800硬盘:30G内存:512M系统:Windows2000AdvancedServer在实验六之前,在安装过程中自动建立的“学生课程数据库”中共有三张关系表Student、Course和SC,登陆的用户名为SYSTEM,密码为MANAGER。接下来的实验就是对学生课程数据库,编写存储过程。(一)统计离散数学的成绩分布情况,即按照各分数段统计人数。1.创建存储过程1)创建需要的表结构。因为存储过程在执行后在客户端并没有返回
2、值,因此需要建立一个表存放执行后的结果,并返回到客户端显示。根据实验要求,我们要统计选修了离散数学的学生的成绩分布,因此我们建立表Rank,其中第一列division显示成绩分段划分,第二列number显示的是成绩在该分数段的学生人数。CREATETABLERank(divisionCHAR(20),numberINT);2)编写存储过程。CREATEORREPLACEPROCEDUREstatistic_mark(nameCHAR(50))//存储过程带有一个字符型参数值,便于统计不同科目的分数分布情况ASDECLAREless6
3、0INT:=0;//分为五个分数段,并置初始值为0b60a70INT:=0;b70a80INT:=0;b80a90INT:=0;more90INT:=0;curcnoCHAR(4);//设字符型变量curcno存放输入的课程名称参数BEGINSELECTcnoINTOcurcno//根据课程名称在Course表中查询查询该课程号FROMCourseWHEREcname=name;IFNOTFOUNDTHEN//如果不存在用户输入的课程名称,返回错误信息RAISEEXCEPTION'输入错误,没有该课程';ENDIF;SELECTco
4、unt(*)INTOless60//查询分数低于60分的学生人数FROMscWHEREcno=curcnoANDgrade<60;SELECTcount(*)INTOb60a70//查询分数在60到70之间的学生人数FROMscWHEREcno=curcnoANDgrade>=60ANDgrade<70;SELECTcount(*)INTOb70a80//查询分数在70到80之间的学生人数FROMscWHEREcno=curcnoANDgrade>=70ANDgrade<80;SELECTcount(*)INTOb80a90//查询
5、分数在80到90之间的学生人数FROMscWHEREcno=curcnoANDgrade>=80ANDgrade<90;SELECTcount(*)INTOmore90//查询分数高于90的学生人数FROMscWHEREcno=curcnoANDgrade>=90;//向表Rank中插入五条记录,显示成绩分布情况INSERTINTORankVALUES('[0,60)',less60);INSERTINTORankVALUES('[60,70)',b60a70);INSERTINTORankVALUES('[70,80)',b70a
6、80);INSERTINTORankVALUES('[80,90)',b80a90);INSERTINTORankVALUES('[90,100]',more90);END;2.执行存储过程首先执行编写好的存储过程statistic_mark,然后在表Rank中查看执行结果。PERFORMPROCEDUREstatistic_mark(‘离散数学’);SELECT*FORMRank;(二)统计任意一门课的平均成绩。1.创建存储过程1)创建需要的表结构。根据实验要求,我们要统计任意一门课的平均成绩,因此我们建立表Avggrade,其中
7、第一列cname显示统计的课程名称,第二列avgg显示选修了该课程的学生平均成绩。CREATETABLEAvggrade(cnameCHAR(50),avggNUMERIC(10,6));2)编写存储过程。CREATEORREPLACEPROCEDUREcollect_avggrade()ASDECLARE//声明变量curnameCHAR(50);curcnoCHAR(4);curavggNUMERIC(10,6);CURSORmycursorFOR//声明游标mycursor查询课程号和名称SELECTcno,cnameFROM
8、course;BEGINOPENmycursor;//打开游标IFmycursor%ISOPENTHEN//条件控制,游标打开时进行以下处理LOOP//循环控制FETCHmycursorINTOcurcno,curname;//游标推