数据库实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用pl/sql编写存储过程访问数据库

(一)统计离散数学的成绩分布情况,即按照各分数段统计人数。

1)建立表Rank,其中第一列division显示成绩分段划分,第二列number显示的是成绩在该分数段的学生人数。

CREATE TABLE Rank(

division CHAR(20),

number INT);

2)编写存储过程。

CREATE OR REPLACE PROCEDURE statistic_mark(name CHAR(50))

//存储过程带有一个字符型参数值,便于统计不同科目的分数分布情况

AS

DECLARE

less60 INT := 0; //分为五个分数段,并置初始值为0

b60a70 INT := 0;

b70a80 INT := 0;

b80a90 INT := 0;

more90 INT := 0;

curcno CHAR(4); //设字符型变量curcno 存放输入的课程名称参数BEGIN

SELECT cno INTO curcno //根据课程名称在Course 表中查询查询该课程号FROM Course

WHERE cname = name;

IF NOT FOUND THEN //如果不存在用户输入的课程名称,返回错误信息RAISE EXCEPTION '输入错误,没有该课程';

END IF;

SELECT count(*) INTO less60 //查询分数低于60 分的学生人数

FROM s

WHERE cno = curcno AND grade < 60;

SELECT count(*) INTO b60a70 //查询分数在60 到70 之间的学生人数

FROM sc

WHERE cno = curcno AND grade >= 60 AND grade < 70;

SELECT count(*) INTO b70a80 //查询分数在70 到80 之间的学生人数

FROM sc

WHERE cno = curcno AND grade >= 70 AND grade < 80;

SELECT count(*) INTO b80a90 //查询分数在80 到90 之间的学生人数

FROM sc

WHERE cno = curcno AND grade >= 80 AND grade < 90;

SELECT count(*) INTO more90 //查询分数高于90 的学生人数

FROM sc

WHERE cno = curcno AND grade >= 90;

INSERT INTO Rank VALUES('[0,60)',less60);//向Rank中插入五条记录显示成绩分布情况

INSERT INTO Rank VALUES('[60,70)',b60a70);

INSERT INTO Rank VALUES('[70,80)',b70a80);

INSERT INTO Rank VALUES('[80,90)',b80a90);

INSERT INTO Rank VALUES('[90,100]',more90);

END;

3)执行存储过程,首先执行编写好的存储过程statistic_mark,然后在表Rank 中查看执行结果。PERFORM PROCEDURE statistic_mark('离散数学');

SELECT * FORM Rank;

(二)统计任意一门课的平均成绩。

1)创建需要的表结构。根据实验要求,我们要统计任意一门课的平均成绩,因此我们建立表Avggrade 其中第一列cname 显示统计的课程名称,第二列avgg 显示选修了该课程的学生平均成绩。CREATE TABLE Avggrade(

cname

avgg

CHAR(50),

NUMERIC(10, 6));

2)编写存储过程。

CREATE OR REPLACE PROCEDURE collect_avggrade()

AS

DECLARE //声明变量

Curname CHAR(50);

Curcno CHAR(4);

curavgg NUMERIC(10, 6);

CURSOR mycursor FOR //声明游标mycursor 查询课程号和名称

SELECT cno, cname FROM course;

BEGIN

OPEN mycursor; //打开游标

IF mycursor%ISOPEN THEN //条件控制,游标打开时进行以下处理

LOOP //循环控制

FETCH mycursor INTO curcno, curname; //游标推进一行,取结果送变量

EXIT WHEN (mycursor%NOTFOUND); //如果没有返回值则退出循环

SELECT AVG(grade) INTO curavgg FROM SC //求该课程的平均值送变量

WHERE cno = curcno;

INSERT INTO Avggrade VALUES(curname, curavgg); //向Avggrade中插入记录显示课程名称和平均成绩

END LOOP; //结束循环控制

END IF; //结束条件控制

CLOSE mycursor; //关闭游标

END;

3)执行存储过程

首先执行编写好的存储过程collect_avggrade,然后在表Avggrade 中查看执行结果。PERFORM PROCEDURE collect_avggrade ();

SELECT * FORM Avggrade;

相关文档
最新文档