首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Oracle 19C入门到精通之PL/SQL流程控制语句

流程控制语句是所有过程性程序设计语言的关键,因为只有能够进行流程控制才能灵活地实现各种操作和功能,PL/SQL也不例外,其主要控制语句及其说明如下表所示:

PL/SQL中的流程控制语句主要包括选择语句、循环语句两大类。

1. 选择语句

选择语句也被称为条件语句,它的主要作用是根据条件的变化选择执行不同的代码,主要分为以下4种语句。

1.1. IF…THEN语句

IF…THEN语句是选择语句中最简单的一种形式,它只做一种情况或条件的判断,其语法格式如下:

IF  THEN

plsql_sentence

END IF;

condition_expression为条件表达式,其值为true时,程序将会执行IF下面的PL/SQL语句(即plsql_sentence语句);其值为false时,程序将会跳过IF下面的语句而直接执行END IF后面的语句。

定义两个字符串变量,然后赋值,接着使用IF…THEN语句比较两个字符串变量的长度,并输出比较结果,代码如下:

set serveroutput on

declare

var_name1 varchar2(50);   --定义两个字符串变量

var_name2 varchar2(50);

begin

var_name1:='Wast';        --给两个字符串变量赋值

var_name2:='xiaofei';

if length(var_name1) 

/*输出比较后的结果*/

dbms_output.put_line('字符串“'||var_name1||'”的长度比字符串“'||var_name2||'”的长度小');

end if;

end;

/

如果IF后面的条件表达式存在“并且”“或者”“非”等逻辑运算,则可以使用AND、OR、NOT等逻辑运算符。另外,如果要判断IF后面的条件表达式的值是否为空值,则需要在条件表达式中使用is和null关键字,如下面的代码:

if last_name is null then

…;

end if;

1.2. IF…THEN…ELSE语句

在编写程序的过程中,IF…THEN…ELSE语句是最常用到的一种选择语句,它可以实现判断两种情况,只要IF后面的条件表达式为FALSE,程序就会执行ELSE语句下面的PL/SQL语句,其语法格式如下:

IF  THEN

plsql_sentence1;

ELSE

plsql_sentence2;

END IF;

condition_expression为条件表达式,若该条件表达式的值为TRUE,则执行IF下面的PL/SQL语句,即plsql_sentence1语句;否则,程序将执行ELSE下面的PL/SQL语句,即plsql_sentence2语句。

通过IF…THEN…ELSE语句实现只有年龄大于或等于60岁,才可以申请退休的功能,否则程序会提示不可以申请退休,代码如下:

set serveroutput on

declare

age int:=55;  --定义整型变量并赋值

begin

if age >= 60 then  --比较年龄是否大于或等于60岁

dbms_output.put_line('您可以申请退休了!');--输出可以退休信息

else

dbms_output.put_line('您小于60岁,不可以申请退休!');  --输出不可退休信息

end if;

end;

/

1.3. IF…THEN…ELSIF语句

IF…THEN…ELSIF语句实现了多分支判断选择,它使程序的判断选择条件更加丰富,更加多样化。如果该语句中的哪个判断分支的表达式为TRUE,那么程序就会执行其下面对应的PL/SQL语句,其语法格式如下:

IF  THEN

plsql_sentence_1;

ELSIF 

THEN plsql_sentence_2;

ELSE plsql_sentence_n;

END IF;

condition_expression1:第一个条件表达式,若其值为FALSE,则程序继续判断condition_expression2表达式。

condition_expression2:第二个条件表达式,若其值为FALSE,则程序继续判断下面的ELSIF语句后面的表达式;若再没有ELSIF语句,则程序将执行ELSE语句下面的PL/SQL语句。

plsql_sentence_1:第一个条件表达式的值为TRUE时,将要执行的PL/SQL语句。

plsql_sentence_2:第二个条件表达式的值为TRUE时,将要执行的PL/SQL语句。

plsql_sentence_n:当其上面所有的条件表达式的值都为FALSE时,将要执行的PL/SQL语句。

首先指定一个月份数值,然后使用IF…THEN…ELSIF语句判断它所属的季节,并输出季节信息,代码如下:

set serveroutput on

declare

month int:=6;     --定义整型变量并赋值

begin

if month >= 0 and month 

dbms_output.put_line(month||'月是春季');

elsif  month >= 4 and month 

dbms_output.put_line(month||'月是夏季');

elsif  month >= 7 and month 

dbms_output.put_line(month||'月是秋季');

elsif  month >= 10 and month 

dbms_output.put_line(month||'月是冬季');

else

dbms_output.put_line('对不起,月份不合法!');

end if;

end;

/

注意:在IF…THEN…ELSIF语句中,多个条件表达式之间不能存在逻辑上的冲突,否则程序将判断出错。

1.4. CASE语句

CASE语句的执行方式与IF…THEN…ELSIF语句十分相似。在CASE关键字的后面有一个选择器,它通常是一个变量,程序就从这个选择器开始执行,接下来是WHEN子句,并且在WHEN关键字的后面是一个表达式,程序将根据选择器的值去匹配每个WHEN子句中的表达式的值,以实现执行不同的PL/SQL语句的功能,其语法格式如下:

CASE 

WHEN  THEN plsql_sentence_1;

WHEN  THEN plsql_sentence_2;

WHEN  THEN plsql_sentence_n;

[ELSE plsql_sentence;]

END CASE;

selector:一个变量,用来存储要检测的值,通常被称为选择器。该选择器的值需要与WHEN子句中的表达式的值进行匹配。

expression_1:第一个WHEN子句中的表达式,它通常是一个常量,当选择器的值等于该表达式的值时,程序将执行plsql_sentence_1语句。

expression_2:第二个WHEN子句中的表达式,它通常也是一个常量,当选择器的值等于该表达式的值时,程序将执行plsql_sentence_2语句。

expression_n:第n个WHEN子句中的表达式,它通常也是一个常量,当选择器的值等于该表达式的值时,程序将执行plsql_sentence_n语句。

plsql_sentence:一个PL/SQL语句,当没有与选择器匹配的WHEN常量时,程序将执行该PL/SQL语句,其所在的ELSE语句是一个可选项。

首先指定一个季度数值,然后使用CASE语句判断它所包含的月份信息并输出,代码如下:

set serveroutput on

declare

season int:=3;            --定义整型变量并赋值

aboutInfo varchar2(50);   --存储月份信息

begin

case season    --判断季度

when 1 then    --若是1季度

aboutInfo := season||'季度包括1,2,3月份';

when 2 then    --若是2季度

aboutInfo := season||'季度包括4,5,6月份';

when 3 then    --若是3季度

aboutInfo := season||'季度包括7,8,9月份';

when 4 then    --若是4季度

aboutInfo := season||'季度包括10,11,12月份';

else           --若季度不合法

aboutInfo := season||'季节不合法';

end case;

dbms_output.put_line(aboutinfo);  --输出该季度所包含的月份信息

end;

/

在进行多种情况判断时,建议使用CASE语句替换IF…THEN…ELSIF语句,因为CASE语句的语法更加简洁明了,易于阅读。

2. 循环语句

当程序需要反复执行某一操作时,就必须使用循环结构。PL/SQL中的循环语句主要包括LOOP语句、WHILE语句和FOR语句3种。

2.1. LOOP语句

LOOP语句会先执行一次循环体,然后判断EXIT WHEN关键字后面的条件表达式的值是TRUE还是FALSE。如果是TRUE,程序会退出循环体;否则,程序将再次执行循环体。这样就使得程序至少能够执行一次循环体,其语法格式如下:

LOOP

plsql_sentence;

EXIT WHEN end_condition_exp

END LOOP;

plsql_sentence:循环体中的PL/SQL语句,可能是一条语句,也可能是多条,这是循环体的核心部分,这些PL/SQL语句至少会被执行一遍。

end_condition_exp:循环结束表达式,当该表达式的值为TRUE时,程序会退出循环体,否则程序将再次执行循环体。

使用LOOP语句计算前100个自然数的和,并输出到屏幕上,代码如下:

set serveroutput on

declare

sum_i int:= 0;  --定义整数变量,存储整数和

i int:= 0;      --定义整数变量,存储自然数

begin

loop            --循环累加自然数

i:=i+1;         --得出自然数

sum_i:= sum_i+i;    --计算前n个自然数的和

exit when i = 100;  --当循环100次时,程序退出循环体

end loop;

dbms_output.put_line('前100个自然数的和是:'||sum_i); --计算前100个自然数的和

end;

/

2.2. WHILE语句

WHILE语句根据它的条件表达式的值执行零次或多次循环体,在每次执行循环体之前,首先要判断条件表达式的值是否为TRUE,若为TRUE,则程序执行循环体;否则退出WHILE循环,然后继续执行WHILE语句后面的其他代码,其语法格式如下:

WHILE condition_expression LOOP

plsql_sentence;

END LOOP;

condition_expression为条件表达式,当其值为TRUE时,程序执行循环体,否则程序退出循环体。程序每次在执行循环体之前,都要首先判断该表达式的值是否为TRUE。

使用WHILE语句计算前100个自然数的和,并输出到屏幕上,代码如下:

set serveroutput on

declare

sum_i int:= 0;    --定义整数变量,存储整数和

i int:= 0;        --定义整数变量,存储自然数

begin

while i

i:=i+1;           --得出自然数

sum_i:= sum_i+i;  --计算前n个自然数的和

end loop;

dbms_output.put_line('前100个自然数的和是:'||sum_i); --计算前100个自然数的和

end;

/

2.3. FOR语句

FOR语句是一个可预置循环次数的循环控制语句,它有一个循环计数器,通常是一个整型变量,通过这个循环计数器来控制循环执行的次数。该计数器可以从小到大进行记录,也可以相反,从大到小进行记录。另外,该计数器值的合法性由上限值和下限值控制,若计数器值在上限值和下限值的范围内,则程序执行循环;否则,终止循环。其语法格式如下:

FOR variable_counter_name in [REVERSE] lower_limit..upper_limit LOOP

plsql_sentence;

END LOOP;

variable_counter_name:表示一个变量,通常为整数类型,用来作为计数器。默认情况下,计数器的值会循环递增,当在循环中使用REVERSE关键字时,计数器的值会随循环递减。

lower_limit:计数器的下限值,当计数器的值小于下限值时,程序终止FOR循环。

upper_limit:计数器的上限值,当计数器的值大于上限值时,程序终止FOR循环。

plsql_sentence:表示PL/SQL语句,作为FOR语句的循环体。

使用FOR语句计算前100个自然数中偶数之和,并输出到屏幕上,代码如下:

set serveroutput on

declare

sum_i int:= 0;    --定义整数变量,存储整数和

begin

for i in reverse 1..100 loop  --遍历前100个自然数

if mod(i,2)=0 then            --判断是否为偶数

sum_i:=sum_i+i;               --计算偶数和

end if;

end loop;

dbms_output.put_line('前100个自然数中偶数之和是:'||sum_i);

end;

/

在上述FOR语句中,由于使用了关键字REVERSE,表示计数器i的值为递减状态,即i的初始值为100,随着每次递减1,最后一次FOR循环时,i的值变为1。如果在FOR语句中不使用关键字REVERSE,则表示计数器i的值为递增状态,即i的初始值为1。

2.4. GOTO语句

GOTO语句的语法格式如下:

GOTO label;

这是个无条件转向语句。当执行GOTO语句时,控制程序会立即转到由标签标识的语句中。其中,label是在PL/SQL中定义的符号。标签使用双箭头括号(>)括起来。

使用GOTO语句的例子,代码如下:

… --程序其他部分

  --定义了一个转向标签goto_mark

… --程序其他部分

IF no>98050 THEN

GOTO goto_mark;  --如果条件成立,则转向goto_mark继续执行

… --程序其他部分

在使用GOTO语句时需要十分谨慎。不必要的GOTO语句会使程序代码复杂化,容易出错,而且难以理解和维护。事实上,几乎所有使用GOTO的语句都可以使用其他PL/SQL控制结构(如循环或条件结构)重新编写。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/ObvO7IncecOKHPqp4KQ4cK2Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券