Oracle数据库之PL/SQL流程控制语句

在任何计算机编程语言(如C,Java,C#等)都有各种流程控制语句,同样,在PL/SQL中也存在这样的流程控制结构。

几种常见的流程控制结构:

一、条件结构

1. 简单IF结构

-- 简单IF结构
IF <布尔表达式> THEN
满足条件时执行的语句
END IF;

2. IF-ELSE结构

-- IF-ELSE结构
IF <布尔表达式> THEN
满足条件时执行的语句
ELSE
不满足条件时执行的语句
END IF;

3. 多重IF

-- 多重IF
IF <布尔表达式1> THEN
满足条件1时执行的语句
ELSIF <布尔表达式2> THEN
满足条件2时执行的语句
ELSIF <布尔表达式3> THEN
满足条件3时执行的语句
ELSE
满足条件1、2、3均不满足时执行的语句
END IF;

注意:ELSIF不能写成ELSEIF

示例:

DECLARE
emp_id employee.id%TYPE := &empid;
emp_salary employee.salary%TYPE;
info VARCHAR2(50);
BEGIN
SELECT salary INTO emp_salary FROM employee WHERE id = emp_id;
/* 根据薪资情况判断 */
IF emp_salary < 1500 THEN
info := '太少了,不加就辞职!';
ELSIF emp_salary <3000 THEN
info := '还将就,先干着吧!';
ELSE
info := '目前还比较满意,以后再看!';
END IF;
DBMS_OUTPUT.PUT_LINE(info);
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE('没有数据~!');
WHEN others THEN
DBMS_OUTPUT.PUT_LINE(sqlcode || '---' || sqlerrm);
END;

4. CASE

语法一:

CASE 条件表达式
WHEN 条件表达式结果1 THEN
语句1
WHEN 条件表达式结果2 THEN
语句2
......
WHEN 条件表达式结果n THEN
语句n
[ELSE 条件表达式结果]
END CASE;

示例:

DECLARE
grade CHAR(1);
BEGIN
grade := '&g'; CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
END CASE;
END;

语法二:

CASE
WHEN 条件表达式1 THEN
语句1
WHEN 条件表达式2 THEN
语句2
......
WHEN 条件表达式n THEN
语句n
[ELSE 语句]
END CASE;

示例:

DECLARE
grade CHAR(1);
BEGIN
grade := '&g'; CASE
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
END CASE;
END;

二、循环结构

1. 简单循环

语法:

LOOP
循环体语句;
[EXIT WHEN <条件语句>]
END LOOP;

示例1:

DECLARE
x NUMBER(2) := 0;
BEGIN
LOOP
x := x + 1;
DBMS_OUTPUT.PUT_LINE('x的当前值为:'||x);
EXIT WHEN x = 10;
END LOOP;
END;

示例2:

DECLARE
x NUMBER := 0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE ('循环中: x = ' || TO_CHAR(x));
x := x + 1;
IF x > 3 THEN
EXIT;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' 循环结束: x = ' || TO_CHAR(x));
END;

2. WHILE循环

语法:

WHILE <布尔表达式> LOOP
循环体语句;
END LOOP;

示例1:

DECLARE
done BOOLEAN := FALSE;
BEGIN
WHILE done LOOP
DBMS_OUTPUT.PUT_LINE ('Oh, no! It's wrong!');
done := TRUE;
END LOOP; WHILE NOT done LOOP
DBMS_OUTPUT.PUT_LINE ('Hello, world!');
done := TRUE;
END LOOP;
END;

3. FOR循环

语法:

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

说明:

使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE后面的数字应是从小到大的顺序,而且必须是整数,不能是变量或表达式。

示例1:

BEGIN
DBMS_OUTPUT.PUT_LINE ('下限 < 上限:'); FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP; DBMS_OUTPUT.PUT_LINE ('下限 = 上限:'); FOR i IN 2..2 LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP; DBMS_OUTPUT.PUT_LINE ('下限 > 上限:'); FOR i IN 3..1 LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP;
END;

输出结果:

下限 < 上限:
1
2
3
下限 = 上限:
2
下限 > 上限:

示例2:

BEGIN
DBMS_OUTPUT.PUT_LINE ('反转 -- 下限 < 上限:'); FOR i IN REVERSE 1..3 LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP; DBMS_OUTPUT.PUT_LINE ('反转 -- 下限 = 上限:'); FOR i IN REVERSE 2..2 LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP; DBMS_OUTPUT.PUT_LINE ('反转 -- 下限 > 上限:'); FOR i IN REVERSE 3..1 LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP;
END;

运行结果:

反转 -- 下限 < 上限:
3
2
1
反转 -- 下限 = 上限:
2
反转 -- 下限 > 上限:

循环结构中,均可以在适当的时候构建条件使用EXIT退出循环结构。

三、顺序结构

1. GOTO

GOTO语句用于跳转到指定<<标号>>去执行语句,是无条件跳转到指定的标号去的意思。

注意:标号是用<< >>括起来的标识符。

语法:

GOTO label;

GOTO语句缺点是会增加程序的复杂性,降低可读性,所以Oracle建议不要使用。

示例:

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;

2. NULL

空语句,执行没有任何实际效果,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性,通常用于占位置。

示例1:

DECLARE
valid BOOLEAN := TRUE;
BEGIN
GOTO update_row; IF valid THEN
<<update_row>>
NULL;
END IF;
END;

示例2:

DECLARE
v_job_id VARCHAR2(10);
v_emp_id NUMBER(6) := 110;
BEGIN
SELECT job_id INTO v_job_id
FROM employees
WHERE employee_id = v_emp_id; IF v_job_id = 'SA_REP' THEN
UPDATE employees
SET commission_pct = commission_pct * 1.2;
ELSE
NULL;
END IF;
END;

Oracle数据库之PL/SQL流程控制语句的更多相关文章

  1. oracle数据库之PL/SQL 流程控制语句

    介绍 PL/SQL 的流程控制语句, 包括如下三类: 1.控制语句: IF 语句 2.循环语句: LOOP 语句, EXIT 语句 3.顺序语句: GOTO 语句, NULL 语句 一 条件语句 IF ...

  2. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  3. Oracle数据库之PL/SQL异常处理

    Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料 ...

  4. PL/SQL流程控制语句

    PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF < ...

  5. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  6. Oracle数据库之PL/SQL包

    Oracle数据库之PL/SQL包 1. 简介 包(PACKAGE)是一种数据对象,它是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来 ...

  7. Oracle数据库之PL/SQL过程与函数

    Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...

  8. Oracle数据库之PL/SQL程序设计简介

    PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...

  9. oracle数据库之PL/SQL 块结构和组成元素

    一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...

随机推荐

  1. 不用预计算切向空间的Normal mapping

    先贴出shader 吧 等有时间了 来阐述原理 // vertex shader //varying vec3 ViewPosition; //varying vec3 Normal; varying ...

  2. Facebook 开源三款图像识别人工智能软件

    Facebook今天开源了三款人工智能图像分割(Image Segmentation)软件,分别是DeepMask.SharpMask和MultiPathNet,三款工具相互配合完成一个完整的图像识别 ...

  3. 【HDOJ】1078 FatMouse and Cheese

    这道题目是典型的DFS+记忆化搜索, DP思想.符合:含重叠子问题,无后效性等特点. #include <cstdio> #include <cstring> #include ...

  4. Autodesk 开源 3D 打印机

    Autodesk 开源 3D 打印机 Autodesk在知识共享-署名-相同方式共享许可证下公开了其3D打印机Ember的树脂.机械设计.电路图纸的细节,在GNU GPL许可证下公开了固件.打印机运行 ...

  5. 【转】Android Activity和Intent机制学习笔记----不错

    原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根 ...

  6. King's Quest - poj 1904(强连通分量+外挂输入输出)

    题意:国王有N个儿子,每个儿子都有很多喜欢的姑娘,官员为每个王子都找了一个姑娘让他们结婚,不过国王不满意,他想知道他的每个儿子都可以和那个姑娘结婚(前提他的儿子必须喜欢那个姑娘) 分析:因为最下面一行 ...

  7. php开启错误提示

    1.在php.ini文件里加上下面两句 display_errors = Onerror_reporting = E_ALL | E_STRICT 2.在Apache的 httpd.conf文件里加上 ...

  8. TestNG 与 Junit的比较(转)

    转自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html 1.         JDK 5 Annotations (JDK ...

  9. openssl生成自签名证书

    1.生成x509格式的CA自签名证书 openssl req -new -x509 -keyout ca.key -out ca.crt 2.生成服务端的私钥(key文件)及申请证书文件csr文件 o ...

  10. How to Read, Write XLSX File in Java - Apach POI Example---reference

    No matter how Microsoft is doing in comparison with Google, Microsoft Office is still the most used ...