PL/SQL综合实例(转)

PL/SQL综合实例:



本节将在前面学习的PL/SQL基础上分析一个较复杂的实例,以教会读者编写完整的PL/SQL程序的方法。

实例设计

1. 功能设计
某高校开发的研究生招生系统,要求设计PL/SQL程序对考生的成绩数据进行处理,处理的逻辑是根据每门专业课的最低分数线和总分的最低分数线自动将考生归类为录取考生、调剂考生和落选考生。
为此设计两个数据表,graduate数据表存放考生成绩,result数据表存放处理结果,PL/SQL程序完成的功能就是将graduate数据表中的数据逐行扫描,根据分数线进行判断,计算出各科总分,在result数据表中将标志字段自动添加上“录取”或“落选”。
2. 数据表设计
Graduate数据表结构如表9.3所示。
0653011563368315.JPG
0653011563581710.JPG
0653011563764114.JPG

创建数据表

为了简化起见,实例的两个数据表都建立在默认的scott用户下,这样读者可以完全模拟实例一致的环境进行学习。
1. 创建graduate数据表
在图9.58所示的创建表的【一般信息】选项卡中按照下列步骤进行配置。
在【名称】文本框中输入“GRADUATE”。
在【方案】下拉列表框中选择“SCOTT”。
在【表空间】下拉列表框中选择“USERS”。
在【表结构定义区】按照图所示进行设置。
完成设置后单击0653011563723642.JPG按钮。
0653011563850245.JPG
读者也可以在【SQLPlus Worksheet】中执行下列SQL代码,直接创建数据表SCOTT.GRADUATE。
――――――――――――――――――――――――――――――――――――――
CREATE TABLE "SCOTT"."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)
TABLESPACE "USERS"
――――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章 creategraduate.sql
2. 创建result数据表
在图9.59所示的创建表的【一般信息】选项卡中按照下列步骤进行配置。
在【名称】文本框中输入“RESULT”。
在【方案】下拉列表框中选择“SCOTT”。
在【表空间】下拉列表框中选择“USERS”。
在【表结构定义区】按照图所示进行设置。
完成设置后单击0653011563979558.JPG按钮。
0653011563958201.JPG
读者也可以在【SQLPlus Worksheet】中执行下列SQL代码,直接创建数据表SCOTT.RESULT。
――――――――――――――――――――――――――――――――――――――
CREATE TABLE "SCOTT"."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)
TABLESPACE "USERS"
――――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章 createresult.sql

录入数据

利用【表数据编辑器】向SCOTT.GRADUATE数据表录入下列实验数据。如图9.60所示。
0653011564252292.JPG
读者也可以在【SQLPlus Worksheet】中执行下列SQL代码,直接向数据表SCOTT.GRADUATE中录入测试数据。
065301156455124.JPG
065301156477447.JPG
【配套程序位置】:第9章 insertgraduate.sql

程序设计

1. 创建处理过程scott.graduateprocess
在【SQLPlus Worksheet】中执行下列PL/SQL代码,创建处理过程scott.graduateprocess。执行结果如图9.61所示。
0653011565391043.JPG
―――――――――――――――――――――――――――――――――――――
/*定义过程参数*/
create or replace procedure scott.graduateprocess(
tempzhengzhi in scott.graduate.zhengzhi%type,
tempyingyu in scott.graduate.yingyu%type,
tempzhuanye1 in scott.graduate.zhuanye1%type,
tempzhuanye2 in scott.graduate.zhuanye2%type,
tempzhuanye3 in scott.graduate.zhuanye3%type,
temptotalscore in scott.result.totalscore%type) as
/*定义graduaterecord为记录型变量,临时存放通过游标从graduate数据表中提取的记录*/
graduaterecord scott.graduate%rowtype;
/*定义graduatetotalscore为数值型变量,统计总分*/
graduatetotalscore scott.result.totalscore%type;
/*定义graduateflag为字符型变量,根据结果放入“落选”或“录取”,然后写入数据表result*/
graduateflag varchar2(4);
/*定义游标graduatecursor,存放的是所有的graduate数据表中的记录*/
cursor graduatecursor is
select * from scott.graduate;
/*定义异常处理errormessage*/
errormessage exception;
/*开始执行*/
begin
/*打开游标*/
open graduatecursor;
/*如果游标没有数据,激活异常处理*/
if graduatecursor%notfound then
raise errormessage;
end if;
/*游标有数据,指针指向第一条记录,每执行fetch命令,就自动下移,循环执行到记录提取完毕为止*/
loop
fetch graduatecursor into graduaterecord;
/*计算总分*/
graduatetotalscore:=graduaterecord.yingyu+graduaterecord.zhengzhi+graduaterecord.zhuanye1+graduaterecord.zhuanye2
+graduaterecord.zhuanye3;
/*判断单科和总分是否满足录取要求,若满足,graduateflag变量值为“录取”,否则为“落选”*/
if (graduaterecord.yingyu>=tempyingyu and
graduaterecord.zhengzhi>=tempzhengzhi and
graduaterecord.zhuanye1>=tempzhuanye1 and
graduaterecord.zhuanye2>=tempzhuanye2 and
graduaterecord.zhuanye3>=tempzhuanye3 and
graduatetotalscore>=temptotalscore) then
graduateflag:='录取';
else
graduateflag:='落选';
end if;
/*当游标数据提取完毕后,退出循环”*/
exit when graduatecursor%notfound;
/*向结果数据表result中插入处理后的数据*/
insert into
scott.result(bh,xm,lb,zhengzhi,yingyu,zhuanye1,zhuanye2,zhuanye3,totalscore,flag)
values(graduaterecord.bh,graduaterecord.xm,graduaterecord.lb,graduaterecord.zhengzhi,graduate
record.yingyu,graduaterecord.zhuanye1,graduaterecord.zhuanye2,graduaterecord.zhuanye3,graduat
etotalscore,graduateflag);
end loop;
/*关闭游标*/
close graduatecursor;
/*提交结果*/
commit;
/*异常处理,提示错误信息*/
exception
when errormessage then
dbms_output.put_line('无法打开数据表');
/*程序执行结束”*/
end;
―――――――――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章 creategraduateprocess.sql
2. 主程序mainprocess设计
主程序调用名为graduateprocess的过程来完成处理,代码设计如下:
―――――――――――――――――――――――――――――――――――――
set serveroutput on
/*定义6个入口变量,分别对应graduate数据表中的专业课和总分分数线*/
declare
score1 number(4,1);
score2 number(4,1);
score3 number(4,1);
score4 number(4,1);
score5 number(4,1);
scoretotal number(5,1);
/*将分数线赋值,在这里修改各值就代表不同的分数线*/
begin
score1:=50;
score2:=56;
score3:=60;
score4:=62;
score5:=64;
scoretotal:=325;
/*调用处理过程*/
scott.graduateprocess(score1,score2,score3,score4,score5,scoretotal);
end;
――――――――――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章 mainprocess.sql
在上述过程设计中,综合使用了异常处理、游标、变量等PL/SQL程序设计要素,通过主程序向带参数执行的过程传递参数。

执行结果

1.第一组执行结果
(1)将mainprocess.sql文件稍做改动,在【SQLPlus Worksheet】中执行下列PL/SQL程序,执行结果如图9.62所示。
0653011565770396.JPG
0653011570136702.JPG
0653011570110150.JPG
【配套程序位置】:第9章 mainprocess1.sql
(2)利用【表数据编辑器】查看scott.result数据表的结果,如图9.63所示。
0653011570458261.JPG
2. 第二组执行结果
(1)将mainprocess.sql文件稍做改动,在【SQLPlus Worksheet】中执行下列PL/SQL程序,执行结果如图9.64所示。
0653011571083577.JPG
0653011571326537.JPG
【配套程序位置】:第9章 mainprocess1.sql
(2)利用【表数据编辑器】查看scott.result数据表的结果,如图9.63所示。
0653011571438280.JPG
2. 第二组执行结果
(1)将mainprocess.sql文件稍做改动,在【SQLPlus Worksheet】中执行下列PL/SQL程序,执行结果如图9.64所示。
0653011571651361.JPG
0653011571770174.JPG
【配套程序位置】:第9章 mainprocess2.sql
0653011571878939.JPG
(2)利用【表数据编辑器】查看scott.result数据表的结果,如图9.65所示。
0653011572356027.JPG
综合运用PL/SQL的设计要素,就可以设计出很多复杂的处理程序,这也是DBA的一项重要任务。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-123143/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-123143/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sqlSQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其中之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值