招生系统通过存储过程实现考生成绩查询表
登记考生信息和考试成绩,根据考生成绩和录取分数线判断是否录取,汇总考生信息,考试科目五门单科过线,总分过线的才被录取。
1.创建考生信息表
create table stuinfo
(
id int,
name varchar2(10),
en int,
ma int,
zz int,
zy int,
os int
);
2.创建查询成绩的表解构
create table sstuinfo as select * from stuinfo where 1=2;
alter table sstuinfo add total int;
alter table sstuinfo add flag varchar2(10);
--alter table sstuinfo modify flag varchar2(20);
//可以改变flag的长度
3.创建存储过程
create or replace procedure proc_1(p_en int,p_ma int,p_zz int,p_zy int,p_os int,p_total int)
--输入过线分数
as
cursor mycur is select * from stuinfo;
v_row stuinfo%rowtype;
v_total sstuinfo.total%type;
v_flag sstuinfo.flag%type;
begin
delete from sstuinfo;
--清空下查询成绩表
commit;
open mycur;--打开游标
fetch mycur into v_row;--读取下一行
while (mycur%found) loop
v_total:=v_row.en+v_row.ma+v_row.zz+v_row.zy+v_row.os;
if(v_row.en>=p_en and v_row.ma>=p_ma and v_row.zz>=p_zz and v_row.zy>=p_zy and v_row.os>=p_os)
--比较输入分数线与考生成绩
then
v_flag:='通过';
else
v_flag :='未通过';
end if;
insert into sstuinfo values(v_row.id,v_row.name,v_row.en,v_row.ma,v_row.zz,v_row.zy,v_row.os,v_total,v_flag);
--添加到考生查询成绩表
fetch mycur into v_row;
end loop;
commit;
close mycur;--关闭游标
end;
SQL>
--初始的考生成绩表
SQL> select * from stuinfo;
ID NAME EN MA ZZ ZY OS
---------- ---------- ---------- ---------- ---------- ---------- ----------
1 a1 54 65 63 85 95
2 a2 74 65 83 75 85
--没有使用存储过程定义的考生查询成绩表
SQL> select * from sstuinfo;
no rows selected
--执行存储过程
SQL> exec proc_1(60,60,60,60,60,345);
PL/SQL procedure successfully completed
SQL>
SQL> set wrap off
--执行存储过程之后添加成功的结果
SQL> select * from sstuinfo;
ID NAME EN ZZ MA OS ZY TOTAL FLAG
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 a1 54 65 63 85 95 362 未通过
2 a2 74 65 83 75 85 382 通过