ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:42.55KB ,
资源ID:8809392      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8809392.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PL SQL 用户指南和参考第四章PLSQL的控制结构.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

PL SQL 用户指南和参考第四章PLSQL的控制结构.docx

1、PL SQL 用户指南和参考第四章PLSQL的控制结构第四章 PL/SQL的控制结构一、PL/SQL控制结构一览根据结构定理(structure theorem),任何计算机程序都可以用下图中的基本控制结构来表示。它们可以任意组合来解决问题。 选择结构是用于测试条件的,根据条件的真假,执行一系列语句。一个条件语句可以是任何能够返回布尔值(TRUE或FALSE)的变量或表达式。循环结构能在条件满足的情况下反复执行。序列结构只是简单的按照顺序执行语句。 二、条件控制:IF和CASE语句有时候,我们需要根据具体的条件来采取不同的对策。IF语句就能让我们按条件来执行语句序列。也就是说,语句序列的执行与

2、否取决于某个给定的条件。有三种IF语句:IF-THEN、IF-THEN-ELSE和IF-THEN-ELSIF。CASE语句是条件判断的精简形式,它能计算条件表达式的值并在多个对应动作中做出选择。 1、IF-THEN语句IF语句最简单的形式就是把一个条件和一个语句序列用关键字THEN和END IF关联起来: IFconditionTHENsequence_of_statementsENDIF; 只有在条件值为真的时候语句序列才能被执行。如果条件值为假或是空,IF语句就什么都不做。无论哪种情况,控制权最后还是会被传递到下一个语句,如下例: IFsalesQUOTATHENcompute_bonus

3、(empid);UPDATEpayrollSETpay=pay+bonusWHEREempno=emp_id;ENDIF; 如果我们把IF语句放到一行,就可以像下面这样编写: IFxyTHENhigh:=x;ENDIF; 2、IF-THEN-ELSE语句第二种形式的IF语句使用关键字ELSE添加了一个额外的处理选项,如下: IFconditionTHENsequence_of_statements1ELSEsequence_of_statements2ENDIF; 当条件为假或空时,ELSE子句中的语句序列就会被执行。下例中,第一个UPDATE语句在条件为真的情况下执行,而第二个UPDATE语

4、句在条件为假或为空的情况下才会被执行: IFtrans_type=CRTHENUPDATEaccountsSETbalance=balance+creditWHERE.ELSEUPDATEaccountsSETbalance=balance-debitWHERE.ENDIF; THEN和ELSE子句中也可以包含IF语句。就是说IF语句能够被嵌套使用,如下例所示: IFtrans_type=CRTHENUPDATEaccountsSETbalance=balance+creditWHERE.ELSEIFnew_balance=minimum_balanceTHENUPDATEaccountsSE

5、Tbalance=balance-debitWHERE.ELSERAISEinsufficient_funds;ENDIF;ENDIF; 3、IF-THEN-ELSIF语句有时我们可能需要从几个选项中选择一个,这时我们就需要使用第三种IF语句,添加一个ELSIF关键字提供额外的条件选项,使用方法如下: IFcondition1THENsequence_of_statements1ELSIFcondition2THENsequence_of_statements2ELSEsequence_of_statements3ENDIF; 如果第一个条件为假或空,ELSIF子句就会检测另外一个条件。一个I

6、F语句可以有多个ELSIF子句;最后一个ELSE子句是可选的。条件表达式从上而下的计算。只要有满足的条件,与它关联的语句就会执行,然后控制权转到下一个语句。如果所有的条件都为假或是空,ELSE部分的语句就会执行。看一下下面的例子: BEGIN.IFsales50000THENbonus:=1500;ELSIFsales35000THENbonus:=500;ELSEbonus:=100;ENDIF;INSERTINTOpayrollVALUES(emp_id,bonus,.);END; 如果sales的值大于50000的话,第一个和第二个条件就为真。然而,bonus只会被赋予1500的值,因为

7、第二个条件并没有执行到。当第一个条件为真的话,它关联的语句就会执行,然后控制权转到INSERT语句。 4、CASE语句同IF语句一样,CASE语句也是选出一个语句序列来执行。但是,为了选择出合适的语句序列,CASE会使用一个选择器,而不是多个布尔表达式。想要比较IF和CASE语句的话,请看下面对学校成绩的描述信息: IFgrade=ATHENDBMS_OUTPUT.put_line(Excellent);ELSIFgrade=BTHENDBMS_OUTPUT.put_line(VeryGood);ELSIFgrade=CTHENDBMS_OUTPUT.put_line(Good);ELSIFg

8、rade=DTHENDBMS_OUTPUT.put_line(Fair);ELSIFgrade=FTHENDBMS_OUTPUT.put_line(Poor);ELSEDBMS_OUTPUT.put_line(Nosuchgrade);ENDIF; 请注意这五个布尔表达式,在每一个实例中,我们只对同一变量的值进行检测,看它的分数值是否等于A、B、C、D、E或F。下面我们用CASE语句重新编写上面的程序: CASEgradeWHENATHENDBMS_OUTPUT.put_line(Excellent);WHENBTHENDBMS_OUTPUT.put_line(VeryGood);WHENCT

9、HENDBMS_OUTPUT.put_line(Good);WHENDTHENDBMS_OUTPUT.put_line(Fair);WHENFTHENDBMS_OUTPUT.put_line(Poor);ELSEDBMS_OUTPUT.put_line(Nosuchgrade);ENDCASE; CASE语句的可读性高而且高效,所以,如果可能的话,尽量把IF-THEN-ELEIF都改写成CASE语句。 CASE语句以关键字CASE开头,然后跟上一个选择器,也就是上例中的变量grade。选择器表达式可能是很复杂的。例如,它有可能是一个函数调用。但在通常情况下,它只是一个独立的变量。选择器表达式只

10、被计算一次。它的值可以是除BLOB、BFILE、对象类型、PL/SQL记录、索引表、变长数组或嵌套表之外的任何有效的PL/SQL数据类型。 选择器后面跟着一个或多个WHEN子句,它们是按顺序检测的。选择器的值决定了哪个子句被执行。如果选择器的值等于WHEN子句的表达式值, WHEN子句中的语句序列就会被执行。例如在上面例子中,如果grade等于C,程序就会输出Good。当WHEN子句中的语句序列被执行完毕,控制权会转到下一个语句,而不会再执行后续的WHEN子句。 ELSE子句的工作原理与IF中的类似。上例子中,如果grade的值不与任何一个WHEN子句匹配,ELSE部分就会被执行,No suc

11、h grade就会被输出。ELSE子语是可选的。但是,如果我们省略了ELSE子句,PL/SQL就会为我们添加隐式的ELSE子句: ELSERAISECASE_NOT_FOUND; 如果CASE语句选择了隐式的ELSE子句,PL/SQL就会抛出预定义异常CASE_NOT_FOUND。所以,即使我们省略了ELSE子句,ELSE也会有一个默认的动作。 关键字END CASE是CASE语句结束的标志。这两个关键字必须用空格分开。形式如下: CASEselectorWHENexpression1THENsequence_of_statements1;WHENexpression2THENsequence

12、_of_statements2;.WHENexpressionnTHENsequence_of_statementsn;ELSEsequence_of_statementsN+1;ENDCASElabel_name; 同PL/SQL块一样,CASE语句也是可以加标签的。标签是一个未声明的标识符,必须出现在CASE语句的开头,用双尖括号夹起来。标签的名称也可以出现在CASE语句的结尾处,但不是必须的。 CASE语句中的异常会按正常的方法处理,就是说正常的执行语句停止,控制权转到PL/SQL块或子程序的异常控制部分。 搜寻式CASE语句 PL/SQL还提供下面搜寻形式的CASE语句: CASEWH

13、ENsearch_condition1THENsequence_of_statements1;WHENsearch_condition2THENsequence_of_statements2;.WHENsearch_conditionnTHENsequence_of_statementsn;ELSEsequence_of_statementsN+1;ENDCASElabel_name; 搜寻式CASE语句没有选择器。并且,它的WHEN子句只能包含结果为布尔类型的表达式,产生其它类型结果的表达式是不允许的。示例如下: CASEWHENgrade=ATHENDBMS_OUTPUT.put_line

14、(Excellent);WHENgrade=BTHENDBMS_OUTPUT.put_line(VeryGood);WHENgrade=CTHENDBMS_OUTPUT.put_line(Good);WHENgrade=DTHENDBMS_OUTPUT.put_line(Fair);WHENgrade=FTHENDBMS_OUTPUT.put_line(Poor);ELSEDBMS_OUTPUT.put_line(Nosuchgrade);ENDCASE; 搜寻条件是按顺序计算的。每个搜寻条件的布尔值决定了哪个WHEN子句被执行。一旦WHEN子句被执行,控制权就会被交给下一个语句,后续的搜寻条

15、件就不会被考虑。 如果没有找到搜寻条件为TRUE的子句,ELSE子句就会执行。ELSE虽然是可选的,但是,如果省略了ELSE,PL/SQL就会添加隐式的ELSE子句: ELSERAISECASE_NOT_FOUND; 如果执行过程中有异常发生,我们可以在块或子程序的异常控制部分捕获到。 5、PL/SQL条件控制语句使用准则我们不应该像下面这样使用笨拙的IF语句: IFnew_balanceminimum_balanceTHENoverdrawn:=TRUE;ELSEoverdrawn:=FALSE;ENDIF;.IFoverdrawn=TRUETHENRAISEinsufficient_fun

16、ds;ENDIF; 上面的代码忽视了两个地方。首先,布尔表达式的值可以直接赋给布尔变量。所以我们可以把第一个IF语句简化成下面的语句形式: overdrawn:=new_balanceminimum_balance; 第二,布尔变量本身就是TRUE或FALSE。所以,在IF的条件表达式中直接使用变量本身即可: IFoverdrawnTHEN. 尽可能地使用ELSIF子句代替嵌套IF语句。这样我们的代码就更易读易理解。比较下面两个IF语句: IFcondition1THENstatement1;ELSEIFcondition2THENstatement2;ELSEIFcondition3THEN

17、statement3;ENDIF;ENDIF;ENDIF; IFcondition1THENstatement1;ELSIFcondition2THENstatement2;ELSIFcondition3THENstatement3;ENDIF;这两个语句在逻辑上是等价的,但第一个语句看起来有些混乱,而第二个就较为明显。 如果把单独一个表达式与多个值进行比较的话,我们可以使用CASE语句来代替多个ELSIF子句。 三、循环控制:LOOP和EXIT语句LOOP语句能让我们反复执行一个语句序列。有三种形式的LOOP语句:LOOP,WHILE-LOOP和FOR-LOOP。 1、LOOPLOOP语句最

18、简单的形式就是把语句序列放到关键字LOOP和END LOOP之间,语法如下: LOOPsequence_of_statements;ENDLOOP; 在每一个循环中,语句序列都会被顺序执行,然后再返回循环顶部从头执行。如果不想继续执行,可以使用EXIT语句退出循环。我们可以把一个或多个EXIT语句放到循环里,但不能放到循环外面。有两种形式的EXIT语句:EXIT和EXIT-WHEN。 EXIT EXIT语句会强迫循环无条件终止。当遇到EXIT语句时,循环会立即终止,并把控制权交给下面的语句。示例如下: LOOP.IFcredit_rating3THEN.EXIT;-exitloopimmedi

19、atelyENDIF;ENDLOOP;-controlresumeshere 下面再举一个不能在PL/SQL块中使用EXIT语句的例子: BEGIN.IFcredit_rating100THENEXIT;ENDIF; EXITWHENcount100;这两个语句在逻辑上是等价的,但EXIT-WHEN语句更容易阅读和理解。 循环标签 跟PL/SQL块一样,循环也是可以添加标签。标签必须出现在LOOP语句的开端,语法如下: LOOPsequence_of_statementsENDLOOP; 而在LOOP语句结束部分出现的标签名称是可选的,语法如下: LOOP.ENDLOOPmy_loop; 在L

20、OOP结束部分使用标签名称能够改善可读性。无论使用哪种EXIT语句形式,都可以结束一个封闭的LOOP块,而不仅仅局限于当前的LOOP块。只要在我们想结束的封闭LOOP块上添加一个标签,然后像下面这样在EXIT语句中使用这个标签就可以了:LOOP.LOOP.EXITouterWHEN.-exitbothloopsENDLOOP;.ENDLOOPouter; 2、WHILE-LOOPWHILE-LOOP语句用关键字LOOP和END LOOP把语句序列封闭起来并与一个布尔条件表达式相关联: WHILEconditionLOOPsequence_of_statementsENDLOOP; 每次循环之前

21、,程序都是计算布尔表达式的值。如果条件为真,语句序列就会被执行,然后重新返回循环顶部计算布尔表达式的值;如果布尔表达式的值为假或空,控制权就会被交给循环之后的语句。下面看一个例子: WHILEtotal=25000LOOP.SELECTsalINTOsalaryFROMempWHEREx=x;.total:=total+salary;ENDLOOP; 循环的次数是与条件相关的,而且在循环结束之前是未知的。由于条件是在循环顶部测试的,所以语句序列有可能一次都没有执行。在上面的例子中,如果total的初始值比25000大,那么条件值就是假,循环就会被跳过。有些语言有LOOP UNTIL或是REPE

22、AT UNTIL这样的结构,在底部测试条件表达式的值。这样,语句序列就会至少执行一次。PL/SQL没有这样的结构,但我们可以变通地使用下面的方法来实现这样的功能: LOOPsequence_of_statementsEXITWHENboolean_expression;ENDLOOP; 要保证WHILE循环至少执行一次,在条件表达式中使用初始化过的布尔变量,如下例所示: done:=FALSE;WHILENOTdoneLOOPsequence_of_statements;done:=boolean_expression;ENDLOOP; 在循环内的语句必须为布尔变量赋上一个新值。否则循环就会无

23、限地执行下去。如下例的两个LOOP语句在逻辑上是等价的:WHILETRUELOOP.ENDLOOP; LOOP.ENDLOOP;3、FOR-LOOPFOR语句会在指定的整数范围内进行循环操作。循环的内容被关键字FOR和LOOP封闭起来。两个点(.)作为范围操作符来使用。语法如下: FORcounterINREVERSElower_bound.higher_boundLOOPsequence_of_statementsENDLOOP; 当首次进入FOR循环时,循环的范围就会被确定下来,并且不会重新计算。如下例所示,语句序列会执行三次,每执行一次,循环因子就会增加1。 FORiIN1.3LOOP-

24、assignthevalues1,2,3toisequence_of_statements-executesthreetimesENDLOOP; 下例演示了如果下界值等于上界值,循环中的语句序列只执行一次: FORiIN3.3LOOP-assignthevalues3toisequence_of_statements-executesonetimeENDLOOP; 默认情况下,循环总是从下界到上界。不过也可以使用REVERSE关键字,让循环从上界往下界执行。但是要记住,范围的书写格式仍旧是递增顺序的。 FORiINREVERSE1.3LOOP-assignthevalues3,2,1toise

25、quence_of_statements-executesthreetimesENDLOOP; FOR循环里,循环计数器只能当作常量来引用且不能为它赋值,如下例: FORctrIN1.10LOOPIFNOTfinishedTHENINSERTINTO.VALUES(ctr);-legalfactor:=ctr*2;-legalELSEctr:=10;-notallowedENDIF;ENDLOOP; 迭代法 循环范围的边界可以是文字、变量或表达式,但它们都必须是数字。否则PL/SQL会抛出预定义异常VALUE_ERROR。如下例,下界不一定非得是1。但循环计数器只能是每次增加1。 jIN-5.5kINREVERSEfirst.laststepIN0.TRUNC(high/low)*2 在PL/SQL内部,它会把边界值赋给一个临时的PLS_INTEGER变量,并在需要的时候把值转换成最接近的整数。PLS_INTEGER的范围是-2*31到2*31之间。所以,如果边界值超过这个范围,我们就会得到一个数字溢出错误: DECLAREh

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1