PL/SQL控制语句
本节要点:
- l 选择结构控制语句
- if条件控制语句
- Case语句
- l 循环结构控制语句
- 基本loop循环
- for循环
- while循环
- 嵌套循环
PL/SQL既然是面向过程的编程语言,那么它就有针对逻辑的控制语句,这些语句在日常的PL/SQL编程中起着很重要的作用,可以完成业务逻辑的框架部分。下面就来介绍PL/SQL的逻辑控制语句。
1 选择结构控制语句
1.1 If条件控制语句
条件控制语句就是根据当前某个参数的值来判断进入哪一个流程,这就好像做选择题一样,当满足某个条件时就进入对应的流程,否则进入另一个流程。
语法:
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
- l 在IF语句中,唯一一个必需的子句是IF子句。IF子句指出了要想执行THEN关键字之后列出的语句所必须满足的条件。如果这个条件计算为FALSE,并且提供了第一个ELSIF条件,那么Oracle将转到这个条件。
- l ELSIF子句用来指出在随后的条件得到满足时应该执行的另一个操作过程或一组语句。如果在ELSIF关键字之后列出的条件计算为TRUE,那么将执行在随后的THEN关键字之后列出的语句。
- l 如果在IF和ELSIF子句中提供的条件都是FALSE,将自动执行ELSE子句中提供的任何语句。
- l IF语句总是以END IF关键字结束。
注意:ELSIF子句的关键字是一个单词,不能写成“ELSEIF”或“ELSE IF”
示例:编写PL/SQL语句块,根据所购买图书的零售价,然后确定在发货时应该包括的礼品。
DECLARE
v_gift VARCHAR2(20);
c_retailprice NUMBER(5,2):=&price;
BEGIN
IF c_retailprice>56 THEN
v_gift:='FREE SHIPPING';
ELSIF c_retailprice>25 THEN
v_gift:='BOOKCOVER';
ELSIF c_retailprice>12 THEN
v_gift:='BOX OF BOOK LABELS';
ELSE
v_gift:='BOOKMARKER';
END IF;
DBMS_OUTPUT.PUT_LINE('The gift for a book costing '||c_retailprice||' is a '||v_gift);
END
示例:请按以下对应关系,根据成绩的不同,打印出对应的级别
>90 A
>80 B
>70 C
>=60 D
<60 E
DECLARE
v_grade VARCHAR2(20);
c_score NUMBER(5, 2) := &score;
BEGIN
IF c_score > 90 THEN
v_grade := 'A';
ELSIF c_score > 80 THEN
v_grade := 'B';
ELSIF c_score > 70 THEN
v_grade := 'C';
ELSIF c_score >= 60 THEN
v_grade := 'D';
ELSIF c_score < 60 THEN
v_grade := 'E';
ELSE
v_grade := 'Error put in';
END IF;
DBMS_OUTPUT.PUT_LINE('The grade is ' || v_grade);
END;
1.2 CASE语句
CASE语句同IF语句类似,也是根据条件选择对应的语句执行。
语法:
CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
WHEN expressionN THEN resultN
[ ELSE resultN+1]
END;
示例:根据不同的输入打印不同的信息
DECLARE
v_grade char(1) := UPPER('&p_grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal := CASE v_grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Very Good' WHEN 'C' THEN 'Good' ELSE 'No such grade' END;
DBMS_OUTPUT.PUT_LINE(' Grade: ' || v_grade || ' Appraisal: ' ||
v_appraisal);
END;
2 循环结构控制语句
希望反复执行PL/SQL块的可执行部分中的语句。创建一个循环,其中包括要执行的语句,这个循环一直重复,直到满足某个条件为止,这时将会退出循环。有三种类型的循环,你可以在PL/SQL块的可执行部分使用它们,以便重复执行一组语句:
- l 基本loop循环
- l FOR循环
- l WHILE循环
2.1 基本loop循环
语法:
LOOP
statements;
EXIT [WHEN condition];
END LOOP;
- l 基本loop循环用来执行循环语句,直到满足了EXIT子句指定的条件为止。
- l 根据指定的条件,执行循环的次数在各次执行时可能是不同的。
- l LOOP关键字指出循环的开始,END LOOP指出循环的结束。LOOP与END LOOP之间的所有语句将一直重复执行,直到退出循环为止。
- l EXIT关键字指出应该何时退出循环。
注意:因为要执行的语句之后列出了EXIT的关键字,所以循环中任何语句至少自动执行一次。这被称为“后测试”(post-test)。在执行语句之后,将评估EXIT子句中列出的任何条件,如果添加为TRUE,那么循环将会结束,然后将执行PL/SQL块的其余部分。
示例:创建一个打印一系列数字的循环。
DECLARE
v_counter NUMBER(1) := 0;
BEGIN
LOOP
v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||
v_counter);
EXIT WHEN v_counter = 4;
END LOOP;
END;
示例:打印1-10之间的偶数
DECLARE
v_counter NUMBER(2) := 1;
BEGIN
LOOP
if mod(v_counter, 2) = 0 then
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||
v_counter);
end if;
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
2.2 for循环
语法:
FOR counter IN[REVERSE] lower_limit..upper_limit LOOP
statements;
END LOOP;
- l FOR循环也使用一个计数器来控制循环的执行次数。
- l 计数器不是一个必须在PL/SQL块的声明部分声明的变量。在第一次执行LOOP时,将隐含声明计数器。
- l FOR子句要求用户指出计数器的上限和下限。也即,必须指定计数器的初始值(lower_limit)以及终止循环的值(upper_limit)。
- l 在每一次执行循环时,计数器都将增加1。到达定义为计数器上限的值之后,就将退出这个循环。
- l 如果在这个子句中包括了REVERSE关键字,那么计数器可以采取相反的方式(计数器减少)
示例:FOR循环使用i作为循环计数器,IN关键字指定范围
BEGIN
FOR I IN 1 .. 10 LOOP
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' || i);
END LOOP;
END;
2.3 while循环
执行一系列语句,直到条件变为FALSE为止。与前面循环不同,如果条件最初为FALSE,那么永远不能进入这个循环。 在WHILE子句提供的条件决定了循环将在何时终止。
语法:
WHILE condition LOOP
statements;
END LOOP;
示例:PL/SQL块中使用WHILE循环来显示变量的值,直到指定的条件为FALSE为止。
DECLARE
v_counter NUMBER(2):=0;
BEGIN
WHILE v_counter<15 LOOP
DBMS_OUTPUT.PUT_LINE('The current value of the counter is '||v_counter);
v_counter:=v_counter+1;
END LOOP;
END;
示例:请打印出1~10之间的偶数(注:请用While loop的语法实现)
DECLARE
v_counter NUMBER(2) := 1;
BEGIN
WHILE v_counter <= 10 LOOP
if mod(v_counter, 2) = 0 then
DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||v_counter);
end if;
v_counter := v_counter + 1;
END LOOP;
END;
2.4 嵌套循环
任何类型的循环都可以嵌套在另一个循环中。
注意:在控制返回外部循环之前,必须完成内部循环的执行。在控制返回循环之后,只要外部循环的条件有效,就会再次执行外部循环,这包括了内部循环的执行。这个过程将一直继续,直到外部循环结束为止。
示例:PL/SQL块包含了一个嵌套的FOR循环
DECLARE
v_counter NUMBER(2):=0;
BEGIN
WHILE v_counter<3 LOOP
FOR i IN 1..2 LOOP
DBMS_OUTPUT.PUT_LINE('The current value of the FOR LOOP counter is '||i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('The current value of the WHILE counter is '||v_counter);
v_counter:=v_counter+1;
END LOOP;
END;
PL/SQL控制语句的更多相关文章
- orcale 之PL/SQL 控制语句
控制语句是PL/SQL 的关键所在.只有学好这些控制语句才能在工作中更好的实现各种的功能. 选择结构 1. IF 语句 和其他的编程语言很类似.它的具体机构如下: IF(条件)THEN {语句} EL ...
- PL/SQL控制语句(二、循环控制语句)
循环允许重复执行代码直到循环条件匹配,PL/SQL中循环主要有LOOP语句和EXIT语句两种,这两种语句相辅相成,一起组成了PL/SQL的循环结构.在PL/SQL中,循环分为四大类,本文将会讲解其中的 ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- 第三章 PL/SQL编程
3.1 PL/SQL基础知识 3.1.1 什么是PL/SQL? PL/SQL是结合Oracle过程语言和结构化查询语言的一种扩展语言 3.1.1.1 PL/SQL体系 ...
- Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012
\t第1篇 pl/sql开发入门第1章 oracle 11g数据库系统1.1 关系型数据库系统介绍1.1.1 什么是关系型数据模型1.1.2 数据库系统范式1.1.3 关系型数据库管理系统1.1.4 ...
- Oracle之PL/SQL编程
PL/SQL(Procedural Language/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点, ...
- PL/SQL流程控制语句
PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF < ...
- PL/SQL之--流程控制语句
一.简介 像编程语言一样,oracle PL/SQL也有自己的流程控制语句.通过流程控制语句,我们可以在PL/SQL中实现一下比较复杂的业务逻辑操作.而无需到程序中去控制,在一定程度上提高了效率,这也 ...
- Oracle数据库之PL/SQL流程控制语句
Oracle数据库之PL/SQL流程控制语句 在任何计算机编程语言(如C,Java,C#等)都有各种流程控制语句,同样,在PL/SQL中也存在这样的流程控制结构. 几种常见的流程控制结构: 一.条件结 ...
随机推荐
- explain 分析
EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: ...
- oc24--description
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { int _age; double ...
- 修改android手机文件权限
修改android手机文件权限 默认情况下,一个应用肯定是读取不了另外一个应用的数据的,因为权限不够.但是我们一定要读,怎么办? 修改我们要读取文件的权限. Android是基于Linux的,所以修改 ...
- ES 断路器——本质上保护OOM提前抛出异常而已
监控fielddata使用了多少内存以及是否有数据被驱逐是非常重要的.大量的数据被驱逐会导致严重的资源问题以及不好的性能. Fielddata使用可以通过下面的方式来监控: 对于单个索引使用 {ref ...
- Quartz实例:quartz定时任务代码示例
转自:http://www.blogchong.com/post/96.html quartz定时任务调度框架,使用实例. Job类://即实际调度任务实现 . package net.csdn.ed ...
- 根据日期获取,x岁x月x天
c#: DateTime startDate = new DateTime(); DateTime endDate = new DateTime(); ; ; ; if (endDate.Month& ...
- HDU 2520 我是菜鸟我怕谁
2019-05-27 17:52:01 加油!!! 看题时候就要仔细,最后容易忘记%10000 #include <bits/stdc++.h> using namespace std; ...
- python 网络通讯 服务器端代码demo,能够同时处理多个客户端的连接请求
这是一个python网络通讯服务器端的代码demo,能够同时处理多个客户端的连接请求. from socket import * import threading from datetime impo ...
- 一次显式GC导致的High CPU问题处理过程
项目现场反馈系统出现性能问题,具体表现为:所有的客户端响应极其卡顿. 第一反应推测,难道是DB层面出现阻塞?检查v$session会话状态及等待类型未见异常,应该可以排除DB层面原因导致的可能. 继续 ...
- C#中图片转换为Base64编码,Base64编码转换为图片
#region 图片转为base64编码的字符串 public string ImgToBase64String(string Imagefilename) { try { Bitmap bmp = ...