oracle10g 游标查询,Oracle 10g中存储过程中使用游标

实例设计

1. 功能设计

某高校开发的研究生招生系统,要求设计PL/SQL程序对考生的成绩数据进行处理,处理的逻辑是根据每门专业课的最低分数线和总分的最低分数线自动将考生归类为录取考生、调剂考生和落选考生。

为此设计两个数据表,graduate数据表存放考生成绩,result数据表存放处理结果,PL/SQL程序完成的功能就是将graduate数据表中的数据逐行扫描,根据分数线进行判断,计算出各科总分,在result数据表中将标志字段自动添加上“录取”或“落选”。 -

--创建数据库表 --graduate

CREATE TABLE "GRADUATE" (

"BH" NUMBER(10) NOT NULL,

"XM" VARCHAR2(10) NOT NULL,

"LB" VARCHAR2(10) NOT NULL,

"YINGYU" NUMBER(4, 1) NOT NULL,

"ZHENGZHI" NUMBER(4, 1) NOT NULL,

"ZHUANYE1" NUMBER(4, 1) NOT NULL,

"ZHUANYE2" NUMBER(4, 1) NOT NULL,

"ZHUANYE3" NUMBER(4, 1) NOT NULL

)

--创建序列

create sequence my_suquence  --序列名称

minvalue 0                   --序列最小值

start with 201112081                 --序列起始值

maxvalue 999999999                  --序列最大值

increment by 1               --序列的增长值

nocache                      --不预先在内存中缓存

cycle;                       --达到最大值后再重新循环

--插入数据

insert into graduate values(my_suquence.nextval,'张三丰','硕士','56','56','67','78','79');

insert into graduate values(my_suquence.nextval,'张无极','硕士','34','56','56','48','79');

insert into graduate values(my_suquence.nextval,'张翠山','硕士','44','78','76','88','39');

insert into graduate values(my_suquence.nextval,'赵敏','硕士','67','56','69','73','70');

insert into graduate values(my_suquence.nextval,'周芷若','硕士','43','56','45','78','67');

insert into graduate values(my_suquence.nextval,'小昭','硕士','64','66','64','76','79');

--创建数据库表  result

CREATE TABLE "RESULT" (

"BH" NUMBER(10) NOT NULL,

"XM" VARCHAR2(10) NOT NULL,

"LB" VARCHAR2(10) NOT NULL,

"YINGYU" NUMBER(4, 1) NOT NULL,

"ZHENGZHI" NUMBER(4, 1) NOT NULL,

"ZHUANYE1" NUMBER(4, 1) NOT NULL,

"ZHUANYE2" NUMBER(4, 1) NOT NULL,

"ZHUANYE3" NUMBER(4, 1) NOT NULL,

"TOTALSCORE" NUMBER(5, 1) NOT NULL,

"FLAG" VARCHAR2(4) NOT NULL

)

select * from result;

--创建存储过程

create or replace procedure graduateprocess(

tempzhangzhi in graduate.zhengzhi%type,--将表里面的类型赋给该变量

tempyingyu in graduate.yingyu%type,

tempzhuanye1 in graduate.zhuanye1%type,

tempzhuanye2 in graduate.zhuanye2%type,

tempzhuanye3 in graduate.zhuanye3%type,

temptotalscore in result.totalscore%type)

as

--定义graduate为记录型变量,临时存放通过游标从graduate表中提取的记录

graduaterecord graduate%rowtype;

--定义graduatetotalscore为数值型变量,统计总分

graduatetotalscore result.totalscore%type;

--定义graduateflag 为字符型变量,根据结果放入落选或录取

graduateflag varchar2(4);

--定义游标graduatecursor,存放的是所有的graduate数据表中的记录

cursor graduatecursor is

select * from graduate;

--定义异常处理

errormessage exception;

begin

--打开游标

open graduatecursor;

if graduatecursor%not found then

--如果没有数据。抛出异常

raise errormessage;

end if;

--如果有数据,将数据循环出来

loop

fetch graduatecursor into graduaterecord;

--计算总分

graduatetotalscore:=graduaterecord.zhengzhi+graduaterecord.yingyu+graduaterecord.zhuanye1+graduaterecord.zhuanye2+graduaterecord.zhuanye3;

--比较判断条件,看是否将数据插入到result数据库中

if(graduaterecord.yingyu>=tempyingyu and

graduaterecord.zhengzhi>=tempzhengzhi and

graduaterecord.zhuanye1>=tempzhuanye1 and

graduaterecord.zhuanye2>=tempzhuanye2 and

graduaterecord.zhuanye3>=tempzhuanye3 and

graduaterecord.totalscore>=temptotalscore )

then

graduateflag:='录取'

else

graduateflag:='落选'

--退出if

end if;

--退出游标循环

exit when graduatecursor%notfound;

--向result数据库中插入数据

insert into result(BH,xm,lb,yingyu,zhengzhi,zhuanye1,zhuanye2,zhuanye3,totalscore,flag)

values(graduaterecord.BH,graduaterecord.XM,graduaterecord.LB,graduaterecord.YINGYU,graduaterecord.ZHENGZHI,

graduaterecord.ZHUANYE1,graduaterecord.ZHUANYE2,graduaterecord.ZHUANYE3,graduatetotalscore,graduateflag);

end loop;

--关闭游标

close graduatecursor;

commit;--提交结果

--处理异常

exception

when errormessage then

dbms_output.put_line('无法打开数据表');

/*程序执行结束"*/

end;

end graduateprocess;--存储过程结束

本文出自:亿恩科技【www.enkj.com】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值