知识点: PL/SQL 有 3 种类型的条件控制结构:IF、ELSIF 和 CASE 语句。掌握 IF 语句的用法, 掌握 ELSIF 语句的用法, 理解嵌套 IF 语句的用法, 掌握 CASE 语句的用法。
IF 语句有两种形式:IF-THEN 和 IF-THEN-ELSE。使用 IF-THEN 语句,可以指定需要执行的一组动作。换句话说,只有当条件的计算结果为 TRUE 时,才回执行这组动作。 IF-THEN-ELSE 语句指定两组动作。当条件的计算结果为 FALSE 或者 NULL 时,才会执行第 2 组动作。
IF-THEN 语句是选择语句中最简单的一种形式,它只做一种情况或条件判断。 IF-THEN 语句语法:
IF CONDITION THEN
STATEMENT ;
END IF;
语法说明:
CONDITION 是条件表达式,当其值为 true 时,程序才会执行 THEN 后面,END IF 前面的 PL/SQL 具体操作语句 STATEMENT;如果值为 false 或 null 时,程序则不会执行 STATEMENT 语句,而是执行 END IF 后面的语句。
第一步:使用scott账号登录PLSQL Developer,并且单击菜单栏【文件】——【新建】——【SQL Window】,即可打开SQL Window窗口。
第二步:在SQL Window窗口,输入SQL语句。
declare
v_num1 number := 5;
v_num2 number := 3;
begin
if v_num1>v_num2 then
dbms_output.put_line('v_num1比较大');
end if;
end;
第三步:在工具栏单击执行按钮,然后在SQL Window窗口切换到【输出】,查案结果。
注意:在点击【执行】工具按钮时,会弹出一个提示框“"动态执行表不可访问, 本会话的自动统计被禁止。在执行菜单里你可以禁止统计, 或在v$session,v$sesstat和v$statname表里获得选择权限。"
简单处理办法:忽略此提示,直接单击【确定】或者勾选【不再显示此信息】后再单击【确定】。
详细解决办法:点击链接
在编写程序的过程中,if……then……else 语句是最常用到的一种选择语句,它可以实现判断两种情况,只要 if 后面的条件表达式为 false,程序就会执行 else 语句下面的 PL/SQL语句。if……then……else 语句的语法:
IF CONDITION THEN
STATEMENT 1;
ELSE
STATEMENT 2;
END IF;
语法说明:
CONDITION 为条件表达式,当其值为 true 时,程序才会执行 THEN 后面,ELSE 前面 的 PL/SQL 具体操作语句 STATEMENT;如果值为 false 或 null 时,程序则会执行 ELSE后,END IF 前的 STATEMENT 语句。
第一步:在SQL Window窗口,输入SQL语句。
declare
v_age int := 56;
begin
if v_age > 55 then
dbms_output.put_line('您可以申请退休了!');
else
dbms_output.put_line('继续为人民服务!');
end if;
end;
第二步:在工具栏单击执行按钮,然后在SQL Window窗口切换到【输出】,查案结果。
在某些情况下,IF语句中所使用的条件的计算值可能是NULL,而不是TRUE或者FALSE。对于 IF-THEN 结构,如果相关的条件计算值为 NULL,则不执行指定的语句,会继续执行END IF 之后的可执行语句。对于 IF-THEN-ELSE 语句,当相关的条件计算值为 NULL 时,会执行保留字 ELSE 所指定的语句。
declare
v_num1 number := 5 ;
v_num2 number ;
begin
if v_num1 = v_num2 then
dbms_output.put_line (' v_num1 = v_num2 ');
else
dbms_output.put_line(' v_num1 != v_num2 ');
end if;
dbms_output.put_line('这里是end if后面的语句');
end;
输出结果:
说明:变量 v_num2 没有赋值,因此,变量 v_num2 的值是 NULL,所以条件 v_num1=v_num2 的结果为 NULL。当条件表达式值为 FALSE 或 NULL 时,IF-THEN-ELSE 语句会执行 ELSE 块中的内容。
当有多个情况或条件需要判断时,ELSIF 语句常常被使用。这里特别值得注意的是, PL/SQL 中的 ELSIF 写法不同于 java 或 C 语言程序中的 elseif。ELSIF 的写法为“ELSIF”, 中间没有字母“E”,一定不要写成了“ELSEIF”。elsif 语句的语法:
IF CONDITION1 THEN
STATEMENT 1;
ELSIF CONDITION2 THEN
STATEMENT 2;
……
ELSE
STATEMENT 3;
END IF;
语法说明:
首先判断 CONDITION1 的值是否为 true,若为 true 程序则执行 STATEMENT1;如果值为false 或 null 时,程序则会判断 CONDITION2 的值,若为 true 程序则执行 STATEMENT2,如果值为 false 或 null ,则继续向下判断,只要条件为 true 就会执行当前 ELSIF 语句块中的 STATEMENT 语句,若所有 ELSIF 语句条件部分都判断完,都为 false 或 null,程序才会执行 ELSE 的 STATEMENT3 语句。
declare
v_month int := 2 ;
begin
if v_month >= 3 and v_month <= 5 then
dbms_output.put_line (' 这是春季 ');
elsif v_month >= 6 and v_month <= 8 then
dbms_output.put_line (' 这是夏季 ');
elsif v_month >= 9 and v_month <= 11 then
dbms_output.put_line (' 这是秋季 ');
elsif v_month =12 or v_month <= 2 and v_month > 0 then
dbms_output.put_line (' 这是冬季 ');
else
dbms_output.put_line (' 对不起,月份数字不合法! ');
end if;
end;
注意:在 if-then-elsif 语句中,多个条件表达式之间不能存在逻辑上的冲突,否则程序将判断出错。
代码说明:在oracle中and比or优先级高。
示例中的代码 v_month =12 or v_month <= 2 and v_month > 0 ,等同于v_month =12 or ( v_month <= 2 and v_month > 0 )
输出结果:
需求:指定某个员工涨工资(emp表)
说明:如果这个员工是10号部门,工资上涨300;如果这个员工是20号部门,工资上涨500;如果这个员工是30号部门,工资上涨600
我们已经学了各类 IF 语句的语法及用法。那么它们除了能各自使用外,还能相互嵌套使用。逻辑思路上与 java 语言或者 c 语言大体是一致的。
嵌套 IF 语句没有所谓的语法规范,仅是将这些 IF 语句结构根据逻辑需要嵌套起来使用而已。
declare
v_num1 number := &input_num1 ;
v_num2 number := &input_num2 ;
v_total number;
begin
if v_num1 > v_num2 then
dbms_output.put_line (' 这是外层if结构的if部分 ');
v_total := v_num1 - v_num2 ;
else
dbms_output.put_line (' 这是外层if结构的else部分 ');
v_total := v_num1 + v_num2 ;
if v_total < 0 then --内层if语句开始
dbms_output.put_line (' 这是内层if结构的if部分 ');
v_total := v_total * (-1) ;
end if;--内层if语句结构结束
end if;
dbms_output.put_line (' v_total 的值是 ' || v_total );
end;
语法说明:变量声明 v_num1 number :=&input_num1 中,&input_num1 表示由控制台用户输入一个数,赋值给 v_num1 变量。
结果演示:
从 Oracle9i 之后,PL/SQL 也可以像其他变成语言一样使用 case 语句,case 语句的执行方式与 if…then…elsif 语句十分相似。在 case 关键字的后面有一个选择器,它通常是一个变量,程序就从这个选择器开始执行,接下来是 when 子句,并且在 when 关键字的后面是一个表达式,程序将根据选择器的值去匹配每个 when 子句的表达式的值,从而实现执行不同的 PL/SQL 语句。 CASE 语句的语法:
CASE selector
WHEN expression_1 THEN statement_1;
WHEN expression_2 THEN statement_2;
…
WHEN expression_n THEN statement_n;
[ELSE statement ;]
END CASE;
语法说明:
Selector 表示一个变量,用来存储要检测的值,通常称之为选择器。该选择器的值需要与when 子句中的表达式的值进行匹配。如果 selector 的值与 WHEN 后面的 expression 值相等,那么程序将执行当前 WHEN-THEN 后面的 statement 语句。如果不相等,则依次向下判断相等,如若没有匹相等配项,则程序执行 ELSE 后的 statement 语句。
declare
v_session int :=3; --定义整形变量并赋值,表示季度
v_aboutInfo varchar2(50); --存储输出信息
begin
case v_session
when 1 then
v_aboutInfo := v_session || '季度包括 1,2,3 月份' ; --变量和字符串的拼接
when 2 then
v_aboutInfo := v_session || '季度包括 4,5,6 月份';
when 3 then
v_aboutInfo := v_session || '季度包括 7,8,9 月份';
when 4 then
v_aboutInfo := v_session || '季度包括 10,11,12 月份';
else
v_aboutInfo := v_session ||'季度数字不合法';
end case;
dbms_output.put_line(v_aboutInfo);
end;
输出结果:
捜索式 CASE 语句有个能够产生布尔值(TRUE. FALSE 或者 NULL)的搜索条件。当特定搜索条件的计算结果为 TRUE 时,会执行与该条件相关的语句组合。 捜索式 CASE 语句的语法:
CASE
WHEN search_condition_1 THEN statement_1;
WHEN search_condition_2 THEN statement_2;
……
WHEN search_condition_n THEN statement_n;
[ELSE statement;]
END CASE;
语法说明:
search_condition_1 表示一个条件表达式。当搜索条件的计算结果为 TRUE 时,执行控制权传递给与之相关的语句。如果任何搜索条件都不会产生 TRUE,则就会执行与 ELSE 子句相关的语句。
declare
v_grade int :=89; --分数
v_gradeInfo varchar2(20); --分数等级信息
begin
case
when v_grade >=90 THEN v_gradeInfo := 'A';
when v_grade >=80 THEN v_gradeInfo := 'B';
when v_grade >=70 THEN v_gradeInfo := 'C';
when v_grade >=60 THEN v_gradeInfo := 'D';
ELSE v_gradeInfo := 'E';
end case;
dbms_output.put_line( '成绩等级为:' || v_gradeInfo );
end;
输出结果:
注意: 搜索式 CASE 语句在结构上不同于简单的 CASE 语句,搜索式 CASE 语句没有选择器。
技巧:在进行多种情况判断时,建议使用 case 替换 if…then…elsif 语句,因为 case 语句的语法更加简洁明了,易于阅读。
=========这里是结束分割线===========