PL/SQL控制语句

简介:

12-10

IF-THEN-ELSE 语句


IF语句:包含IF-THEN和IF-THEN-ELSE

ELSIF语句:如果IF不成立 允许怎样


循环1


IF condition

THEN

.....

END IF;


例子

declare

v_count NUMBER(10):=0;

v_empno NUMBER(4):=7888;

begin

select count(1) into v_count from emp where empno=v_empno;

IF v_empno=0

THEN

insert into emp(empno,ename,job,hiredate,sal,deptno) values(v_empno,'张三','经理',TRUNC(SYSDATE),1000,20);

END IF;

commit;

exception

when others

then

dbms_output.put_line(SQLERRM);

end;


循环2

IF condition

THEN

......

ELSE

......

END IF;


例子

declare

v_count NUMBER(10):=0;

v_empno NUMBER(4):=7888;

begin

select count(1) into v_count from emp where empno = v_empno;

IF v_count=0

THEN 

insert into emp (empno,ename,job,hiredate,sal,deptno) values(v_empno,'张三','经理' ,TRUNC(SYSDATE),1000,20);

ELSE

update emp set ename='张三',job='经理',hiredate=TRUNC(SYSDATE),sal=1000,deptno=20  where empno=v_empno;

END IF;

commit;

exception

when others

then

dbms_output.put_line(SQLERRM);

end;


嵌套IF语句


declare

v_sal NUMBER(7,2);

v_deptno NUMBER(2);

v_job varchar2(9);

begin

select deptno,v_job,sal into v_deptno,v_job,v_sal from emp where empno=&empno;

IF v_deptno=20

THEN

IF v_job='CLERK'

THEN

v_sal := v_sal *(1+0.12);

ELSIF v_job='ANALYST'

THEN

v_sal := v_sal * (1+0.19);

END IF;

ELSE

dbms_output.put_line('仅部门编号为20的员工才能加薪');

END IF;

end;




IF-THEN-ELSIF语句


IF condition-1

THEN

statements-1

ELSIF condition-N

THEN

statements-N

[ELSE

else_statements]

end if;


当开始IF条件为false或者null时  则elsif 就执行另一个条件 包含多个elsif语句时 只有当有是true时 才会被执行 然后忽略掉所有其他的ELSIF 语句 进入end if。如果所有的elsif都失败  则进入else语句


例子   有问题   待解决

declare

v_character char(1);

begin

v_character := '&tmpvar';

IF    v_character = 'A'

THEN

dbms_output.put_line('当前输出字符串:'|| v_character);

ELSIF v_character = 'B'

THEN

dbms_output.put_line('当前输出字符串:'|| v_character);

ELSIF v_character = 'C'

THEN

dbms_output.put_line('当前输出字符串:'|| v_character);

else

dbms_output.put_line('不是1-3之间的字符');

END IF;

END;


 18  /

输入 tmpvar 的值:  A

原值    4:      v_character := &tmpvar;

新值    4:      v_character := A;

        v_character := A;

                       *

第 4 行出现错误:

ORA-06550: 第 4 行, 第 17 列:

PLS-00201: 必须声明标识符 'A'

ORA-06550: 第 4 行, 第 2 列:

PL/SQL: Statement ignored



declare

v_character char(1);

begin

v_character := &tmpvar;

IF    v_character = '1'

THEN

dbms_output.put_line('当前输出字符串:'|| v_character);

ELSIF v_character = '2'

THEN

dbms_output.put_line('当前输出字符串:'|| v_character);

ELSIF v_character = '3'

THEN

dbms_output.put_line('当前输出字符串:'|| v_character);

else

dbms_output.put_line('不是1-3之间的字符');

END IF;

END;


却可以执行 

 18  /

输入 tmpvar 的值:  1

原值    4:      v_character := &tmpvar;

新值    4:      v_character := 1;

当前输出字符串:1


PL/SQL 过程已成功完成。

 

这样就对了


输入 tmpvar 的值:  'A'

原值    4:      v_character := &tmpvar;

新值    4:      v_character := 'A';


PL/SQL 过程已成功完成。



SQL> declare

  2     v_character char(1);

  3  begin

  4     v_character := '&tmpvar';

  5     IF    v_character = 'A'

  6     THEN

  7             dbms_output.put_line('当前输出字符串:'|| v_character);

  8     ELSIF v_character = 'B'

  9     THEN

 10             dbms_output.put_line('当前输出字符串:'|| v_character);

 11     ELSIF v_character = 'C'

 12     THEN

 13             dbms_output.put_line('当前输出字符串:'|| v_character);

 14     else

 15             dbms_output.put_line('不是1-3之间的字符');

 16     END IF;

 17  END;

 18  /

输入 tmpvar 的值:  A

原值    4:      v_character := '&tmpvar';

新值    4:      v_character := 'A';


PL/SQL 过程已成功完成。


这样也可以



12-11 

CASE 语句分为两种类型

简单CASE语句:简单的CASE语句的选择器是一个变量或是一个返回有效数据类型的函数,选择器不可以是布尔类型

搜索CASE语句:搜索CASE语句的选择器是布尔类型的变量或是返回布尔型的函数,默认的选择器为true,当搜索一个true表达式时,可以省略掉选择器的定义


CASE 。。。。

WHEN .......THEN

.........;

WHEN.........THEN

.........;

ELSE

.........;

END CASE;



declare

v_job varchar2(30);

v_empno NUMBER(4):=&empno;

begin

select job into v_job from emp where empno = v_empno;

CASE v_job

WHEN 'CLERK'

THEN

update emp set sal=sal*(1+0.15)

where empno=v_empno;

dbms_output.put_line('为普通职员加薪15%');

WHEN 'MANAGER'

THEN

update emp set sal=sal*(1+0.20)

where empno=v_empno;

dbms_output.put_line('为管理人员加薪20%');

WHEN 'SALESMAN'

THEN

update emp set sal=sal*(1+0.22)

where empno=v_empno;

dbms_output.put_line('为销售人员加薪22%');

else

dbms_output.put_line('员工职级不再加薪的行列');

end case;

end;


搜索CASE语句

CASE [TRUE | FALSE]

WHEN ......THEN

.............;

WHEN.......THEN

.............;

ELSE

.............;

END CASE;



declare

v_sal NUMBER(10,2);

v_empno number(10):=&empno;

begin

select sal into v_sal from emp where empno = v_empno;

CASE

WHEN v_sal BETWEEN 1000 AND 1500

THEN

dbms_output.put_line('员工级别:初级职员');

WHEN v_sal BETWEEN 1500 AND 3000

THEN

dbms_output.put_line('员工级别:中级管理');

WHEN v_sal BETWEEN 3000 AND 5000

THEN

dbms_output.put_line('员工级别:高级经理');

ELSE

dbms_output.put_line('不在级别范围之内');

END CASE;

END;



循环控制语句


简单的loop循环:loop-end loop

数字式for循环:指定循环要执行的次数

while循环:仅当特定的循环满足时才执行循环,当条件不再满足时循环终止 


exit语句

exit语句:直接退出循环

exit when:当when指定的条件满足时退出循环


1.

loop

.........;

end loop;


2.

loop

.....;

.....;

IF ......THEN;

EXIT;

END IF;

END LOOP;


例子 

declare

v_count number(2):=0;

begin

loop

v_count:=v_count+1;

dbms_output.put_line('行' || v_count || ': Hello PLSQL');

IF v_count=10

THEN

EXIT;

end if;

end loop;

dbms_output.put_line('循环已经退出了');

end;




loop

..........;

..........;

exit when .......;

end loop;



例子

declare

v_count number(2):=0;

begin

loop

v_count:=v_count+1;

dbms_output.put_line('行' || v_count || ': Hello PLSQL');

exit when v_count=10;

end loop;

dbms_output.put_line('循环已经退出');

end;




使用continue 继续执行循环

continue 不会中断当前循环的执行,但是continue不会马上退出循环,而是将循环执行跳转到语句的开头开始下一次循环,continue 允许跳过部分循环执行的代码重新开始另一次循环。


例子 在一个输出累加循环的代码中 如果循环体计数大于3,则执行额外的输出代码,如果小于3,将跳过部分代码的执行。


declare

x number:=0;

begin

loop

dbms_output.put_line('内部循环值:x' || TO_CHAR(x));

x := x+1;

IF x < 3

THEN

continue;

end if;

dbms_output.put_line('continue之后的值: x=' || TO_CHAR(x));

exit when x = 5;

end loop;

dbms_output.put_line('循环体结束后的值: x = ' || TO_CHAR(x));

end;


continue when 例子


declare

x number:=0;

begin

loop

dbms_output.put_line('内部循环值:x' || TO_CHAR(x));

x := x+1;

continue when x < 3;

dbms_output.put_line('continue之后的值: x=' || TO_CHAR(x));

exit when x = 5;

end loop;

dbms_output.put_line('循环体结束后的值: x = ' || TO_CHAR(x));

end;



while-loop 循环


loop-end loop类似的代码总能被执行至少一次  这种类型的循环也称为出口值守循环。


while-loop循环在代码之前先判断一个条件,如果条件一开始就为假,那么一次循环也不执行,这种类型叫做 入口值守循环。



while ........loop

..........;

..........;

end loop;


declare

v_count PLS_INTEGER :=1;

begin

while v_count <= 5

loop

dbms_output.put_line('while循环索引值:' || v_count);

v_count:=v_count+1;

end loop;

end;



for-loop 循环分为:

1.数字for循环

2.游标for循环


declare

v_total integer:=0;

begin

for i in 1 .. 3

loop

v_total := v_total +1;

dbms_output.put_line('循环计数器值:'|| i);

end loop;

dbms_output.put_line('循环总计:' || v_total);

end;


 11  /

循环计数器值:1

循环计数器值:2

循环计数器值:3

循环总计:3


PL/SQL 过程已成功完成。



默认循环计数是从低到高的

使用reverse 循环过程将按高到低的顺序执行


declare

v_total integer:=0;

begin

for i in reverse 1 .. 3

loop

v_total := v_total +1;

dbms_output.put_line('循环计数器值:'|| i);

end loop;

dbms_output.put_line('循环总计:' || v_total);

end;


循环计数器值:3

循环计数器值:2

循环计数器值:1

循环总计:3


PL/SQL 过程已成功完成。


1 .. 3 是循环的边界值

边界值可以是变量,表达式,只要是可以赋值的数字


declare

v_counter integer := &counter;

begin

for i in 1 .. v_counter

loop

dbms_output.put_line('循环计数:'|| i);

end loop;

end;



GOTO语句和标签

GOTO语句是一个无条件跳转语句,它可以将程序的执行流程跳转到某个标签。


declare

p varchar2(30);

n PLS_INTEGER := 37;

begin

for j in 2 .. ROUND(SQRT(n)) 

loop

IF n MOD j=0 THEN

p:='不是素数';

GOTO print_now;

END IF;

end loop;

p := '是一个素数';

<<print_now>>

dbms_output.put_line(TO_CHAR(n) || p );

end;


GOTO语句可以向上或向下跳转


declare

v_counter INT:=0;

begin

<<outer>>

v_counter := v_counter +1;

dbms_output.put_line('循环计数器'|| v_counter);

if v_counter < 5

then

GOTO outer;

end if;

end;


NULL语句 表示什么也不执行



null与标签使用示例

declare

done boolean;

begin

for i in 1 .. 50

loop

if done

then

GOTO end_loop;

end if;

<<end_loop>>

NULL;

end loop;

end;




在异常语句块中使用null


declare

v_result int := 0;

begin

v_result:=16/0;

dbms_output.put_line('现在时间是 :' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));

EXCEPTION 

WHEN OTHERS

THEN

NULL;

END;


上面的故意制造被0除  跳到异常处理,null语句表示出异常不进行任何的处理




      本文转自潘阔 51CTO博客,原文链接:http://blog.51cto.com/pankuo/1630246,如需转载请自行联系原作者





目录
打赏
0
0
0
0
348
分享
相关文章
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
646 11
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
74 2
|
10月前
|
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
659 0
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
105 9
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
118 0
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。
Oracle的PL/SQL中FOR语句循环游标的奇幻之旅
【4月更文挑战第19天】在Oracle PL/SQL中,FOR语句与游标结合,提供了一种简化数据遍历的高效方法。传统游标处理涉及多个步骤,而FOR循环游标自动处理细节,使代码更简洁、易读。通过示例展示了如何使用FOR循环游标遍历员工表并打印姓名和薪资,对比传统方式,FOR语句不仅简化代码,还因内部优化提升了执行效率。推荐开发者利用这一功能提高工作效率。