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. PCB模擬設計接地的指導原則

    接地無疑是系統設計中最為棘手的問題之一.盡管它的概念相對比較簡單,實施起來卻很復雜,遺憾的是,它沒有一個簡明扼要可以用詳細步驟描述的方法來保證取得良好效果,但如果在某些細節上處理不當,可能會導致令人頭 ...

  2. XJOI——NOIP2015提高组模拟题19-day1——观光旅行

    http://www.hzxjhs.com:83/contest/493/problem/3 [题目大意] 给定一个有n(n<=500000)个点,m(1<=500000)条边的无向图.给 ...

  3. 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1041 题目大意: 一个二维平面,上面n(n<=1 000 000)个点.问至少选 ...

  4. Minimum Path Sum——LeetCode

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  5. tomcat thread dump 分析【转载】

    前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...

  6. Perl时间处理函数

    官方网址:http://search.cpan.org/~stbey/Date-Calc-6.3/lib/Date/Calc.pod#___top use Date::Calc qw( Days_in ...

  7. [Design Pattern] Singleton Pattern 简单案例

    Singleton Pattern, 即单例模式,用于获取类的一个对象,该对象在整个应用中是其类的唯一对象.单例模式属于创建类的设计模式. SingleObject 作为单例类,内含了一个静态私有的 ...

  8. java的 IO流之缓冲流(转载)

    java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来 ...

  9. php命令行

    转载(http://blog.jobbole.com/109093/) PHP作为一门web开发语言,通常情况下我们都是在Web Server中运行PHP,使用浏览器访问,因此很少关注其命令行操作以及 ...

  10. ubuntu12.04管理员账户登录不了桌面,只能客人会话登录

    ubuntu12.04管理员账户登录不了桌面,只能客人会话登录 求助!!ubuntu12.04管理员账户登录不了桌面,只能客人会话登录. 登录管理员账户时,输入密码后,一直在登录界面循环 费了好大劲啊 ...