介绍PL/SQL的流程控制语句, 包括如下三类:

l 控制语句: IF 语句
l 循环语句: LOOP语句, EXIT语句
l 顺序语句: GOTO语句, NULL语句
1 条件语句
IF <布尔表达式> THEN
PL/SQL 和 SQL语句
END IF;

IF <布尔表达式> THEN
PL/SQL 和 SQL语句
ELSE
其它语句
END IF;

IF <布尔表达式> THEN
PL/SQL 和 SQL语句
ELSIF < 其它布尔表达式> THEN
其它语句
ELSIF < 其它布尔表达式> THEN
其它语句
ELSE
其它语句
END IF;
提示: ELSIF 不能写成 ELSEIF

例1:
SQL> conn hr/hr@pdbtest
Connected.
SQL> set serveroutput on
SQL> DECLARE
2 v_empno employees.employee_id%TYPE :=&empno;
3 V_salary employees.salary%TYPE;
4 V_comment VARCHAR2(35);
5 BEGIN
6 SELECT salary INTO v_salary FROM employees
7 WHERE employee_id = v_empno;
8 IF v_salary < 1500 THEN
9 V_comment:= '太少了,加点吧~!';
10 ELSIF v_salary <3000 THEN
11 V_comment:= '多了点,少点吧~!';
12 ELSE
13 V_comment:= '没有薪水~!';
14 END IF;
15 DBMS_OUTPUT.PUT_LINE(V_comment);
16 exception
17 when no_data_found then
18 DBMS_OUTPUT.PUT_LINE('没有数据~!');
19 when others then
20 DBMS_OUTPUT.PUT_LINE(sqlcode || '---' || sqlerrm);
21 END;
22 /
Enter value for empno: 2278
old 2: v_empno employees.employee_id%TYPE :=&empno;
new 2: v_empno employees.employee_id%TYPE :=2278;
没有数据~!

PL/SQL procedure successfully completed.
2 CASE 表达式
---------格式一---------
CASE 条件表达式
WHEN 条件表达式结果1 THEN 
语句段1
WHEN 条件表达式结果2 THEN
语句段2
......
WHEN 条件表达式结果n THEN
语句段n
[ELSE 条件表达式结果]
END;
---------格式二---------
CASE 
WHEN 条件表达式1 THEN
语句段1
WHEN 条件表达式2 THEN
语句段2
......
WHEN 条件表达式n THEN 
语句段n
[ELSE 语句段]
END;
例1:
SQL> DECLARE
2 V_grade char(1) := UPPER('&p_grade');
3 V_appraisal VARCHAR2(20);
4 BEGIN
5 V_appraisal :=
6 CASE v_grade
7 WHEN 'A' THEN 'Excellent'
8 WHEN 'B' THEN 'Very Good'
9 WHEN 'C' THEN 'Good'
10 ELSE 'No such grade'
11 END;
12 DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||' Appraisal: '|| v_appraisal);
13 END;
14 /
Enter value for p_grade: D
old 2: V_grade char(1) := UPPER('&p_grade');
new 2: V_grade char(1) := UPPER('D');
Grade:D Appraisal: No such grade

PL/SQL procedure successfully completed.
3 循环

  1. 1 简单循环

    LOOP
    要执行的语句;
    EXIT WHEN <条件语句> --条件满足,退出循环语句
    END LOOP;
    3.2 WHILE 循环
    WHILE <布尔表达式> LOOP
    要执行的语句;
    END LOOP;
    3.3 数字式循环

[<<循环标签>>]
FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
要执行的语句;
END LOOP [循环标签];

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。
实例参见Oracle LOOP循环控制语句
例1 在While循环中嵌套loop循环
SQL> DECLARE
2 v_m NUMBER := 101;
3 v_i NUMBER;
4 v_n NUMBER := 0;
5 BEGIN
6 WHILE v_m < 110 LOOP
7 v_i := 2;
8 LOOP
9 IF mod(v_m, v_i) = 0 THEN
10 v_i := 0;
11 EXIT;
12 END IF;
13
14 v_i := v_i + 1;
15 EXIT WHEN v_i > v_m - 1;
16 END LOOP;
17
18 IF v_i > 0 THEN
19 v_n := v_n + 1;
20 DBMS_OUTPUT.PUT_LINE('第'|| v_n || '个素数是' || v_m);
21 END IF;
22
23 v_m := v_m + 2;
24 END LOOP;
25 END;
26 /
第1个素数是101
第2个素数是103
第3个素数是107
第4个素数是109

PL/SQL procedure successfully completed.
4 标号和GOTO

PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:

GOTO label;
......
<<label>> /标号是用<< >>括起来的标识符 /

注意,在以下地方使用是不合法的,编译时会出错误。
跳转到非执行语句前面。
跳转到子块中。
跳转到循环语句中。
跳转到条件语句中。
从异常处理部分跳转到执行。
从条件语句的一部分跳转到另一部分。
例1:
SQL> DECLARE
2 V_counter NUMBER := 1;
3 BEGIN
4 LOOP
5 DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
6 V_counter := v_counter + 1;
7 IF v_counter > 10 THEN
8 GOTO labelOffLOOP;
9 END IF;
10 END LOOP;
11 <<labelOffLOOP>>
12 DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
13 END;
14 /
V_counter的当前值为:1
V_counter的当前值为:2
V_counter的当前值为:3
V_counter的当前值为:4
V_counter的当前值为:5
V_counter的当前值为:6
V_counter的当前值为:7
V_counter的当前值为:8
V_counter的当前值为:9
V_counter的当前值为:10
V_counter的当前值为:11

PL/SQL procedure successfully completed.
5 NULL 语句

在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:
例1:
SQL> DECLARE
2 v_emp_id employees.employee_id%TYPE;
3 v_first_name employees.first_name%TYPE;
4 v_salary employees.salary%TYPE;
5 v_sal_raise NUMBER(3,2);
6 BEGIN
7 v_emp_id := &emp_id;
8 SELECT first_name, salary INTO v_first_name, v_salary
9 FROM employees WHERE employee_id = v_emp_id;
10 IF v_salary <= 3000 THEN
11 v_sal_raise := .10;
12 DBMS_OUTPUT.PUT_LINE(v_first_name||'的工资是'||v_salary
13 ||'、工资涨幅是'||v_sal_raise);
14 ELSE
15 NULL;
16 END IF;
17 END;
18 /
Enter value for emp_id: 206
old 7: v_emp_id := &emp_id;
new 7: v_emp_id := 206;

PL/SQL procedure successfully completed.

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

PL/SQL流程控制语句相关推荐

  1. oracle学习笔记5:pl/sql流程控制语句

    pl/sql编程中的流程控制语句主要有if语句,case语句以及循环语句 下面将逐个介绍这几个语句 1.if语句 -- 根据员工工资来判断奖金的多少,工资在5000以上的奖金500,工资在3000-5 ...

  2. SQL 流程控制语句 之五 RETURN语句介绍

    SQL 流程控制语句 之五 RETURN语句介绍 一.RETURN语句例子: WAITFOR delay '00:00:01' Select * from titles return select * ...

  3. pl/sql:oracle13(跟着宝哥学java:oracle系列:全网最全):pl/sql语法、pl/sql流程控制

    /* PL/SQL过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的数据库编程语言PL提供流程控制的语句SQL提供访问数据库的语句PL/SQL是对sql的扩展 使其 ...

  4. 四、PL/SQL程序控制语句

    文章目录 一.条件控制 IF 语句 1.1 IF语句 1.2 NULL 条件 二.条件控制 CASE语句 三.搜索式CASE语句 四.NULLIF 函数 五.COALESCE函数 六.迭代控制 6.1 ...

  5. SQL 流程控制语句 之四 WAITFOR语句介绍

    一.使用 WAITFOR delay [例]等待1小时10分零12秒后执行select语句 WAITFOR delay '01:10:12' Select * from publishers 二.使用 ...

  6. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...

    [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) --通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE P ...

  7. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  8. PL/SQL -- INSTEAD OF 触发器

    为什么80%的码农都做不了架构师?>>>    --============================== -- PL/SQL --> INSTEAD OF 触发器 -- ...

  9. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

最新文章

  1. node 判断文件夹是否存在
  2. 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
  3. 究竟什么样的简历才能拿到面试?
  4. 用户退出登录清空cookie
  5. Oracle常用的几个父栓
  6. NLP史上最全预训练模型汇总
  7. 夜读源码,带你探究 Go 语言的iota
  8. cshtml的a标签跳转页面_朋友圈标签来了!热门流量关键词带动视频号、小程序、搜一搜...
  9. ubuntu 运行级别initlevel
  10. 数据结构--酒店管理系统(C语言)
  11. java编写简单聊天界面_java实现简单聊天室单人版
  12. 使用SimHash进行海量文本去重
  13. 文件同步工具 GoodSync Enterprise 破解
  14. 带网口插卡4G DTU是什么?RS485/RS232转以太网串口服务器软件怎么实现?
  15. alert日志大量DISTRIB TRAN GDDB.6d36e46c.419.26.15318211问题
  16. 读取JPEG文件的压缩质量/质量因子参数
  17. android设备如何root,如何ROOT安卓设备并授权向日葵客户端(电脑端)
  18. 代码编辑器语法着色功能实现-Java版
  19. Python中进行Excle操作
  20. pythoncharm中文版_Pycharm2020中文版下载

热门文章

  1. PHPTree——快速生成无限多级分类
  2. 使用Jodd简化邮件服务的开发
  3. Fedora 19配置KVM虚拟机的桥接网络
  4. HTML5 geolocation和BaiduMap、BingMap、GoogleMap
  5. 浦发银行(600000.sh):与中国移动珠联璧合联姻
  6. 中小型研发团队架构实践:高效率、低风险,一键发布并测试的持续集成工具Jenkins...
  7. JAVA常见算法题(三十)
  8. 【winform程序】自定义webrowser控件调用IE的版本
  9. codeforces水题100道 第十一题 Codeforces Round #143 (Div. 2) A. Team (brute force)
  10. CloudStack Ctrix官网版本