Oracle数据库之PL/SQL流程控制语句
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流程控制语句的更多相关文章
- oracle数据库之PL/SQL 流程控制语句
介绍 PL/SQL 的流程控制语句, 包括如下三类: 1.控制语句: IF 语句 2.循环语句: LOOP 语句, EXIT 语句 3.顺序语句: GOTO 语句, NULL 语句 一 条件语句 IF ...
- [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...
- Oracle数据库之PL/SQL异常处理
Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料 ...
- PL/SQL流程控制语句
PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF < ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
- Oracle数据库之PL/SQL包
Oracle数据库之PL/SQL包 1. 简介 包(PACKAGE)是一种数据对象,它是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来 ...
- Oracle数据库之PL/SQL过程与函数
Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...
- Oracle数据库之PL/SQL程序设计简介
PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...
- oracle数据库之PL/SQL 块结构和组成元素
一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...
随机推荐
- WinDebug 常用命令表【摘】
启动, 附加进程, 执行和退出(Starting, Attaching, Executing and Exiting) ======================= Start -> All ...
- refresh的停车场
题目描述 refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多.当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先 进入停车 ...
- 调侃Cookie
近期看着某些小朋友那琢急的学习心态,瞬间发文一篇,谨此以助小朋友早日有成! 闲话不扯远,实话见真言,晃悠许久觉得开头还是谈谈Cookie这只菜篮,而且是一只私家菜篮,为啥说它是一只菜篮呢,各位看官必定 ...
- String源码
/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- HDU 3660 Alice and Bob's Trip
树形dp,这道题如果选G++的话,只输入都会超时.我是C++ 1900ms + 飘过的...但是输入优化后就快了很多了,1100ms左右.dfs按层次求最值就行了,差不多也算是博弈吧,到bob取的时候 ...
- 我理解的javascript单线程机制
废话不多说,我们先来看几个例子: 1. setTimeout( console.log(2); result: 2 1 2. console.log(100 setTimeout( cons ...
- WASD控制UI界面血条加减
using UnityEngine; using System.Collections; using UnityEngine.UI; public class HealthController : M ...
- HDU1007 Quoit Design 【分治】
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Robotium -- AndroidUI优化工具HierarchyViewer
为什么使用HierarchyViewer 不合理的布局会使我们的应用程序UI性能变慢,HierarchyViewer能够可视化的角度直观地获得UI布局设计结构和各种属性的信息,帮助我们优化布局设计.H ...
- swift 深入理解Swift的闭包
我们可用swift的闭包来定义变量的值. 先来一个简单的例子大家先感受感受. 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: ...