21+ORACLE实验指导(10)

2019-08-03 12:10

… end; /

2)、声明部分(Declare section)

此PL/SQL块用于定义变量。在declare段中,我们可找到前面讲过的常用数据类型,以及下一节要介绍的cursor(光标)变量类型。下面的程序是一个过程的declare段例子。 当存储对象(命名块)产生时,declare 段自动跟着as关键字。在SQL*Plus编写一个PL/SQL代码块(匿名块)时,用户必须指定DECLARE。 Create or replace procedure samp(I_salary in number, I_city in number)

as

--这时DECLARE段;因为我们正在进行命名存储对象的编码,declare是隐含的,不需写---出。

Accum1 number; Accum2 number;

H_date date := sysdate; -变量能在此初始化 Status_flag varchar2(1); Mess_text varchar2(80);

Temp_buffer varchar2(1);

--象下面的光标将在下面一节讨论 Cursor my_cursor Is

Select employee_number,last_name,first_name From employee a, department b

Where a.department_number = b.department_number And a.salary > I_salary And b.location = I_city; Begin

… end; / 3)、控制结构

控制结构是所有程序设计语言的核心。因为绝大多数系统都用于处理各种不同的情况,因此检测不同条件并加以处理是程序控制的主要部分。本节将详细介绍下列内容: ? 程序控制

? 三种类型的if逻辑结构 ? 四种类型的循环结构

A)程序控制

程序控制由其所使用的变量的状态及其从数据库读写的数据所决定。例如:设想到DMV(执照管理部门)更换驾驶执照。进入DMV所在大楼后,被告知“更换执照请到12-G房间”。而在12-G房间,又得到指示“用现金或保付支票付帐的在1及2台办理,其他付帐方式在3到15台办理”。决策从“我要到那里?”就开始了,在DMV大楼作出决策的程序控制如表6-3所示。

第46页

表6-3决策程序控制

过程或所作的决定 下一步 YES=5 NO=2 1.到此办理驾驶执照 YES=7 NO=3 2.到此处更换驾驶执照 YES=6 NO=4 3.到此考驾驶执照 13 4.噢,走错了地方 13 5.到12-A房间办理驾驶执照 13 6.到12-B房间办理驾驶执照 8 7.到12-G房间 YES=10 NO=9 8.用现金或保付支票(certified check)付帐 YES=11 NO=12 9.用支票或信用卡付帐 13 10.用现金或保付支票付帐,办理更换驾驶执照有关手续 13 11.用支票或信用卡付帐,办理更换驾驶执照有关手续 13 12.无钱付帐 13.离开大楼 B)if逻辑结构

在编写计算机程序时,有各种各样的情况需要处理。这时必须测试条件,如果测试值为TRUE,做某事,为FALSE,做另一件不同的事。PL/SQL提供三种if逻辑结构供用户测试TRUE/FALSE以完成相应的工作。在大多数计算机程序中,多行代码测试一个变量的值,再根据测试结果执行一种或多种操作。在日常生活中,我们也要不断地进行判断,这也正是用户用PL/SQL进行编程的现实依据。

b1)if-then

这个结构用于测试一个简单条件。如果该条件为TRUE,则执行一行或多行代码;如果条件测试为FALSE,则程序控制转到后面的代码。下面代码说明PL/SQL这个逻辑的实现: if var1>10 then var2 := var1+20;

end if;

语句中的测试是我们在“PL/SQl字符集”一节中讲过的关系运算符。上面的语句也可以用下列语句替换,结果一样; if not (var1 <=10) then var2 := var1+20; end if;

if-then语句允许嵌套,如下所示: if var1>10 then if var2 < var1 then var2 := var1+20; end if;

end if;

注意,上面代码中的两个end if ,分别对应两个不同的if。在PL/SQL中实现if逻辑有两条规则: 规则1

每个if语句都有自己的then,以if开始的语句行不跟语句结束符(;)。 规则2

每个if语句块以相应的end if结束。

b2)if-then-else

这种结构与if语句非常相似,唯一不同的是在条件为FALSE时,执行跟在else后的一

第47页

条或多条语句。下述代码给出了此逻辑实现的例子: if var1>10 then var2 := var1+20;

else var2 := var1*var1;

end if;

注意,同样的控制逻辑也可以用另外的方式表达,使var1+20在else部分执行,而var1的平方在if部分完成。如下所示: if var1<=10 then var2 := var1*var1; else

var2 := var1+20; end if;

if-then-else语句也可以嵌套,如下所示: if var1>10 then var2 := var1+20;

else if var1 between 7 and 8 then

else

var2 := var1*var1; var2 := 2*var1;

end if; end if;

下面是PL/SQL中if逻辑的另外两条规则: 规则3

每个if语句有且只有一个else。 规则4

else语句行不跟语句结束符。

if-then-elsif这种结构用于替代嵌套if-then-else结构。前面清单中的嵌套if-then-else语句可改写为:

if var1>10 then var2 := var1+20;

elsif var1 between 7 and 8 then var2 := 2*var1; else

var2 := var1*var1;

end if;

PL/SQL中有关if逻辑的最后一条规则: 规则5

elsif无匹配的end if。

下面的代码段中,end if仿佛针对前面的elsif: if var1>10 then var2 := var1+20; elsif var1 between 7 and 8 then var2 := 2*var1;

第48页

end if;

实际上,该end if术语本语句块开始的if,而不属于elsif关键字。注意上列各清单的代码缩进部分是如何表示它们属于那一条件的。

前些例子只说明了一个elsif的语句;但是,在任何if语句中可以有许多elsif语句。值得注意的是else语句是不需要的。下面的例子说明了一个有许多elsif语句的if语句: if location = ‘PHOENIX’ then v_hockey_team_name := ‘COYOTES’; elseif location = ‘NEW YORK CITY ’ then

v_hockey_team_name := ‘RANGERS’; elseif location = ‘OTTAWA’ then v+hockey_team_name := ‘SENATORS’;

end if;

下面列出的两个例子,说明了没有缩进和缩进的区别: /*Code segment 1-不易读*/ if var1 < 5 then var2 := ‘Y’;elsif var1 = 5 then

var2 := ‘N’;

else var2 :=null; end if; /* */ /* Code segment 2- 易读*/

if var1 < 5 then

var2 := ‘Y’; --当var1 < 5时执行此语句 elseif var1 = 5 then

var2 := ‘N’; --当var1 = 5时执行此语句 else

var2 :=null; --当var1 > 5时执行此语句

end if;

关于前面举过的执照管理部门(DMV)的例子,用PL/SQL编程表示其逻辑如下。根据“the_act”的值,过程 12a,12b,12g将被调用:

create or replace procedure license_transaction(the_act in varchar2 as begin if the_act = ‘DCT’ then 12a;

elseif the_act = ‘DT’ then 12b; else 12g; end if; end; /

C)循环

循环提供了一遍又一遍直至完成以前不断地执行同一个处理过程的能力。在现实生活中,从自己的车上卸下杂货的过程中就有两个循环:第一个是将好几个杂货包一个一个搬到家中的重复动作,另外一个循环是你16岁的懒儿子不断抱怨:“为什么总要我来帮着干?”。通常循环采用如表6-4所示的逻辑。

表6-4 循环逻辑

第49页

过程或决定 下一步 1.设置进入循环的条件(如 2 done_loop=N) NO=3 2.结束循环条件为真(如YES = 6 done_loop=Y) 5 5 3.处理数据 YES = 2 NO=5 4.处理更多数据 2 5.设置退出条件(如2 done_loop=Y) 6.完成处理过程 编写循环语句时,要注意的问题是一定要确保在退出条件满足时有相应的退出代码。遗憾的是,很多时候开发人员还是写了无终止的循环(当然,我们没有犯过这样的错误,但我们知道许多人都犯过这样的错误)。在一个联机技术词典中我们曾经看到一个非常精辟的定义,它以精练的形式总结了循环的概念和开发人员最容易犯的错误: 下面几节介绍PL/SQL中使用的几种循环形式。

C1)LOOP-EXIT-END循环

此循环结构由三部分组成,其用法参见下面示例中的注释: cnt:=1; --在循环开始前,初始化循环计数器

loop --第一部分:以循环关键字loop开始循环 cnt:=cnt+1; --第二部分:增加循环计数器的值 if cnt>=100 then -- 测试cnt是否符合退出条件

exit; -- 满足退出条件,退出循环 end if; -- End if与前面的if匹配 …

End loop; -- 第三部分:关键字End loop结束循环 … … …

C2)LOOP-EXIT WHEN-END循环

除退出条件检测有所区别外,此结构与前一个循环结构类似。 cnt:=1; --在循环开始前,初始化循环计数器

loop --第一部分:以循环关键字loop开始循环 cnt:=cnt+1; --第二部分:增加循环计数器的值 exit when cnt>=100 -- 测试cnt是否符合退出条件 … …

End loop; -- 第三部分:关键字End loop结束循环 …

C3)WHILE-LOOP-END循环

此结构在循环的while部分测试退出条件。 cnt:=1; --在循环开始前,初始化循环计数器

while cnt < 100 loop --第一部分:在每次执行循环前,while都要检查退出条件

第50页


21+ORACLE实验指导(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《国际结算》期末试卷及参考答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: