PL/SQL编程基础(四):程序控制(IF,CASE,FOR,LOOP,WHILE LOOP,EXIT,CONTINUE)
程序控制
- 程序结构有分支结构与循环结构;
- 分支结构语法:IF、CASE;
- 循环结构:FOR、WHILE
- LOOP:先执行再判断,至少执行一次;
- WHILE LOOP:先判断再执行,如果不满足条件,就不执行
- FOR循环:已知要循环的次数.
- 如果明确知道循环次数,使用FOR循环;
- 如果不知道循环次数,但是知道循环结束条件,使用LOOP循环.
- 循环控制:EXIT与CONTINUE语句完成。
- PL/SQL程序与其他编程语言一样,也拥有自己的三种程序结构:顺序结构、分支结构、循环结构。这三种不同的结构都有一个共同点,就是它们都只有一个入口,也只有一个出口,这些单一入、出口可以让程序易读、好维护,也可以减少调试的时间。
|
顺序结构 |
|
|
分支结构 |
|
|
循环结构 |
|
分支结构
在PL/SQL程序中的分支语句主要有两类种:IF语句、CASE语句。这两种语句都是需要进行条件的判断。
IF语句
- 对于IF语句有三类语法格式:
|
IF语句 |
IF 判断条件 THEN 满足条件时执行语句 ; END IF ; |
|
|
IF…ELSE语句 |
IF 判断条件 THEN 满足条件时执行的语句 ; ELSE 不满足条件时执行的语句 ; END IF ; |
|
|
IF … ELSIF…ELSE语句 |
IF 判断条件1 THEN 满足条件1时执行的语句 ; ELSIF THEN 满足条件2时执行的语句 ; ... ELSE 所有条件不满足条件时执行的语句 ; END IF ; |
|
|
IF语句 |
|
DECLARE V_count NUMBER; BEGIN SELECT COUNT(empno) INTO V_count FROM emp; IF V_count > 10 THEN DBMS_OUTPUT.put_line('EMP表的记录大于10条'); END IF; END; / |
|
IF…ELSE语句 |
|
DECLARE V_COUNT NUMBER; BEGIN SELECT COUNT(empno) INTO V_COUNT FROM emp; IF V_COUNT >10 THEN DBMS_OUTPUT.put_line('EMP表的记录大于10'); ELSE DBMS_OUTPUT.put_line('EMP表的记录小于10'); END IF; END; / |
|
IF…ELSIF…ELSE语句 |
|
DECLARE V_COUNT NUMBER; BEGIN SELECT COUNT(empno) INTO V_COUNT FROM emp; IF V_COUNT >10 THEN DBMS_OUTPUT.put_line('EMP表的记录大于10'); ELSIF V_COUNT <10 THEN DBMS_OUTPUT.put_line('EMP表的记录小于10'); ELSE DBMS_OUTPUT.put_line('EMP表的记录等于10'); END IF; END; / |
|
查询emp表的工资,输入员工编号,根据编号查询工资,如果工资高于3000元,则显示高工资,如果工资大于2000元,则显示中等工资,如果工资小于2000元,则显示低工资。 |
|
DECLARE V_empSal emp.sal%TYPE;-- 定义变量与emp.sal字段类型相同 V_empName emp.ename%Type;-- 定义变量与emp.ename字段类型相同 V_eno emp.empno%TYPE; -- 定义变量与emp.empno字段类型相同 BEGIN V_eno:=&inputEmpno;-- 用户输入要查找的雇员编号- SELECT ename,sal INTO V_empName,V_empSal FROM emp WHERE empno=V_eno;-- 根据输入的雇员编号查找雇员姓名及工资 IF V_empSal > 3000 THEN -- 判断 DBMS_OUTPUT.put_line(V_empName || '的工资属于高工资!') ; ELSIF v_empSal > 2000 THEN -- 判断 DBMS_OUTPUT.put_line(V_empName || '的工资属于中等工资!') ; ELSE DBMS_OUTPUT.put_line(V_empName || '的工资属于低工资!') ; END IF; END; / |
|
用户输入一个雇员编号,根据它所在的部门给上涨工资,规则:
|
|
DECLARE V_empSal emp.sal%TYPE;-- 定义变量与emp.sal字段类型相同 V_dno emp.deptno%Type;-- 定义变量与emp.ename字段类型相同 V_eno emp.empno%TYPE; -- 定义变量与emp.empno字段类型相同 BEGIN V_eno := &inputEmpno;-- 用户输入要查找的雇员编号- SELECT deptno,sal INTO V_dno,V_empSal FROM emp WHERE empno=V_eno;-- 根据输入的雇员编号查找雇员姓名及工资 IF V_dno =10 THEN -- 判断 IF V_empSal*1.1 >5000 THEN UPDATE emp SET sal=5000 WHERE empno=V_eno; ELSE UPDATE emp SET sal=SAL*1.1 WHERE empno=V_eno; END IF; ELSIF V_dno =20 THEN -- 判断 IF V_empSal*1.2 >5000 THEN UPDATE emp SET sal=5000 WHERE empno=V_eno; ELSE UPDATE emp SET sal=SAL*1.2 WHERE empno=V_eno; END IF; ELSIF V_dno =30 THEN -- 判断 IF V_empSal*1.3 >5000 THEN UPDATE emp SET sal=5000 WHERE empno=V_eno; ELSE UPDATE emp SET sal=SAL*1.3 WHERE empno=V_eno; END IF; END IF; END; / 输入一个员工的编号,那么该员工就会按照部门编号上涨工资 |
-------------------------------------------------------------------------------------------------------------------
常用比较运算符
|
AND运算符表示将多个比较组合成一个,当每一个单独的判断语句为true时,比较的结果就为true。 |
|
BEGIN IF 'MLDN' = 'MLDN' AND 100 = 100 THEN DBMS_OUTPUT.put_line('结果为TRUE,满足条件!') ; END IF ; END; / |
|
BETWEEN…AND表示的是判断某有一个值是否在指定的范围之中,同时匹配的时候会匹配边界值。 |
|
BEGIN IF TO_DATE('1983-09-19','yyyy-mm-dd') BETWEEN TO_DATE('1980-01-01','yyyy-mm-dd') AND TO_DATE('1989-12-31','yyyy-mm-dd') THEN DBMS_OUTPUT.put_line('80后!') ; END IF ; END; / |
|
IN操作符表示判断指定的内容是否在给出的一组数值之中。 |
|
BEGIN IF 10 IN (10,20,30) THEN DBMS_OUTPUT.put_line('数据已成功查找到') ; END IF ; END; / |
|
IS NULL运算符主要是检查某个变量的内容是否是null。 |
|
DECLARE temp BOOLEAN ; -- 定义布尔变量,没有设置内容 BEGIN IF temp IS NULL THEN DBMS_OUTPUT.put_line('temp变量的内容是null。') ; END IF ; END; / |
|
LIKE主要的功能是进行模糊查找操作,可以使用_匹配任意的一个字符,也可以使用%匹配任意多个字符。 |
|
BEGIN IF 'www.mldnjava.cn' LIKE '%mldn%' THEN DBMS_OUTPUT.put_line('可以查找到字符串:mldn') ; END IF ; END; / |
|
NOT表示的是逻辑非,即:可以返回一个布尔类型相反的值(不是null)。 |
|
BEGIN IF NOT FALSE THEN DBMS_OUTPUT.put_line('条件满足,FALSE变为TRUE。') ; END IF ; END; / |
|
OR表示的是或的关系,用于连接若干个条件,其中只要有一个条件满足,结果就为TRUE,只有都不满足的时候结果才返回FALSE。 |
|
BEGIN IF 'MLDN' = 'LXH' OR 10 = 10 THEN DBMS_OUTPUT.put_line('有一个条件满足,返回TRUE。') ; END IF ; END; / |
CASE语句
- CASE语句是一种多条件的判断语句,其功能与IF…ELSIF…ELSE类似,其基本语法如下:
|
CASE [变量] WHEN [值 | 表达式] THEN 执行语句块 ; WHEN [值 | 表达式] THEN 执行语句块 ; WHEN [值 | 表达式] THEN 执行语句块 ; ELSE 条件都不满足时执行语句块; END CASE ; |

|
使用CASE语句判断数值 |
|
DECLARE v_choose NUMBER := 1 ; BEGIN CASE v_choose WHEN 0 THEN DBMS_OUTPUT.put_line('您选择的是第0项。') ; WHEN 1 THEN DBMS_OUTPUT.put_line('您选择的是第1项。') ; ELSE DBMS_OUTPUT.put_line('没有选项满足。') ; END CASE ; END ; / |
|
输入雇员编号,根据雇员的职位进行工资提升,提升要求如下 如果职位是办事员(CLERK),工资增长5%; 如果职位是销售人员(SALESMAN),工资增长8%; 如果职位为经理(MANAGER),工资增长10%; 如果职位为分析员(ANALYST),工资增长20%; 如果职位为总裁(PRESIDENT),工资不增长。 |
|
DECLARE v_job emp.job%TYPE ; v_eno emp.empno%TYPE ; BEGIN v_eno := &inputEmpno ; SELECT job INTO v_job FROM emp WHERE empno=v_eno ; CASE v_job WHEN 'CLERK' THEN UPDATE emp SET sal=sal*1.05 WHERE empno=v_eno ; WHEN 'ANALYST' THEN UPDATE emp SET sal=sal*1.10 WHERE empno=v_eno ; WHEN 'SALESMAN' THEN UPDATE emp SET sal=sal*1.08 WHERE empno=v_eno ; WHEN 'MANAGERK' THEN UPDATE emp SET sal=sal*1.2 WHERE empno=v_eno ; ELSE DBMS_OUTPUT.put_line('雇员:' || v_eno || '工资不具备增长条件。') ; END CASE ; END ; / |
|
使用CASE进行多条件判断和使用IF ELSE实现多条件判断 多条件判断,CASE WHEN更方便 |
|
DECLARE v_salary emp.sal%TYPE ; v_eno emp.empno%TYPE ; BEGIN v_eno := &inputEmpno ; SELECT sal INTO v_salary FROM emp WHERE empno=v_eno ; CASE WHEN v_salary >= 3000 THEN DBMS_OUTPUT.put_line('雇员:' || v_eno || '的收入为高工资。') ; WHEN v_salary >= 2000 AND v_salary <3000 THEN DBMS_OUTPUT.put_line('雇员:' || v_eno || '的收入为中等工资。') ; ELSE DBMS_OUTPUT.put_line('雇员:' || v_eno || '的收入为低工资。') ; END CASE ; END ; / |
|
DECLARE V_empSal emp.sal%TYPE;-- 定义变量与emp.sal字段类型相同 V_dno emp.deptno%Type;-- 定义变量与emp.ename字段类型相同 V_eno emp.empno%TYPE; -- 定义变量与emp.empno字段类型相同 BEGIN V_eno := &inputEmpno;-- 用户输入要查找的雇员编号- SELECT deptno,sal INTO V_dno,V_empSal FROM emp WHERE empno=V_eno;-- 根据输入的雇员编号查找雇员姓名及工资 IF V_dno =10 THEN -- 判断 IF V_empSal*1.1 >5000 THEN UPDATE emp SET sal=5000 WHERE empno=V_eno; ELSE UPDATE emp SET sal=SAL*1.1 WHERE empno=V_eno; END IF; ELSIF V_dno =20 THEN -- 判断 IF V_empSal*1.2 >5000 THEN UPDATE emp SET sal=5000 WHERE empno=V_eno; ELSE UPDATE emp SET sal=SAL*1.2 WHERE empno=V_eno; END IF; ELSIF V_dno =30 THEN -- 判断 IF V_empSal*1.3 >5000 THEN UPDATE emp SET sal=5000 WHERE empno=V_eno; ELSE UPDATE emp SET sal=SAL*1.3 WHERE empno=V_eno; END IF; END IF; END; / |
循环结构
- 循环结构是一种较为常见的语句形式,其功能就是将一段代码执行多次,在循环结构之中有三个重要的组成部分:第一个是循环的初始条件、第二个就是每次循环的判断条件、第三个是循环条件的修改,在PL/SQL程序之中,循环结构一共定义了两种:LOOP循环、FOR循环
- LOOP:先执行再判断,至少执行一次;
- WHILE LOOP:先判断再执行,如果不满足条件,就不执行
- FOR循环:已知要循环的次数.
LOOP循环
- 语法:
|
LOOP 循环执行的语句块 ; EXIT WHEN 循环结束条件 ; 循环结束条件修改 ; END LOOP; |

WHILE…LOOP循环
- 语法:
|
WHILE (循环结束条件) LOOP 循环执行的语句块 ; 循环结束条件修改 ; |
END LOOP ;

FOR循环语法
语法:
|
FOR 循环索引 IN [REVERSE] 循环区域下限 .. 循环区域上限 LOOP 循环执行的语句块 ; END LOOP ; |
|
使用LOOP循环 |
|
DECLARE v_i NUMBER := 1 ; -- 定义一个变量,用于循环 BEGIN LOOP DBMS_OUTPUT.put_line('v_i = ' || v_i) ; EXIT WHEN v_i >= 3 ; v_i := v_i + 1 ; END LOOP ; END ; / |
|
使用WHILE…LOOP循环 v_i = 1 v_i = 2 v_i = 3 |
|
DECLARE v_i NUMBER := 1 ; -- 定义一个变量,用于循环 BEGIN WHILE (v_i <= 3) LOOP DBMS_OUTPUT.put_line('v_i = ' || v_i) ; v_i := v_i + 1 ; END LOOP ; END ; / |
|
使用FOR循环 v_i = 1 v_i = 2 v_i = 3 |
|
DECLARE v_i NUMBER := 1 ; -- 定义一个变量,用于循环 BEGIN FOR v_i IN 1 .. 3 LOOP DBMS_OUTPUT.put_line('v_i = ' || v_i) ; END LOOP ; END ; / |
|
使用REVERSE操作,反转循环. v_i = 3 v_i = 2 v_i = 1 发现结果是一种递减的方式 |
|
DECLARE v_i NUMBER := 1 ; -- 定义一个变量,用于循环 BEGIN FOR v_i IN REVERSE 1 .. 3 LOOP DBMS_OUTPUT.put_line('v_i = ' || v_i) ; END LOOP ; END ; / |
循环控制
- 在正常循环的操作之中,如果需要结束循环或者是退出当前循环,则可以使用EXIT与CONTINUE语句完成。
- 一般这两种控制语句都要结合分支语句进行判断
|
使用EXIT结束循环操作 |
||
|
DECLARE v_i NUMBER := 1 ; -- 定义一个变量,用于循环 BEGIN FOR v_i IN 1 .. 10 LOOP IF v_i = 3 THEN -- 当v_i变量增长到3时结束循环 EXIT ; END IF ; DBMS_OUTPUT.put_line('v_i = ' || v_i) ; END LOOP ; END ; / |
||
|
使用CONTINUE控制循环操作 单行函数-数值函数-取模
|
||
|
DECLARE v_i NUMBER := 1 ; -- 定义一个变量,用于循环 BEGIN FOR v_i IN 1 .. 10 LOOP IF MOD(v_i,2) = 0 THEN -- 为偶数的时候不执行后续方法体 CONTINUE ; END IF ; DBMS_OUTPUT.put_line('v_i = ' || v_i) ; END LOOP ; END ; / |
||
|
使用GOTO进行跳转 无条件跳转,最好不使用. |
||
|
DECLARE v_result NUMBER := 1; BEGIN FOR v_result IN 1 .. 10 LOOP IF v_result = 2 THEN GOTO endPoint ; END IF ; DBMS_OUTPUT.put_line('v_result = ' || v_result) ; END LOOP ; <<endPoint>> DBMS_OUTPUT.put_line('FOR循环提前结束。') ; END ; / |
PL/SQL编程基础(四):程序控制(IF,CASE,FOR,LOOP,WHILE LOOP,EXIT,CONTINUE)的更多相关文章
- Oracle数据库编程:PL/SQL编程基础
2.PL/SQL编程基础: PL/SQL块: declare 定义部分 begin 执行部分 exception 异 ...
- 【PL/SQL编程基础】
[PL/SQL编程基础]语法: declare 声明部分,例如定义变量.常量.游标 begin 程序编写,SQL语句 exception 处理异常 end: / 正斜杠表示执行程序快范例 -- Cre ...
- PL/SQL编程基础(三):数据类型划分
数据类型划分 在Oracle之中所提供的数据类型,一共分为四类: 标量类型(SCALAR,或称基本数据类型) 用于保存单个值,例如:字符串.数字.日期.布尔: 标量类型只是作为单一类型的数据存在,有的 ...
- Oracle Pl/SQL编程基础
Pl/SQL简介 提高应用程序的运行性能, 提供模块化的程序设计, 自定义标示符, 具有过程语言控制结构, 良好的兼容性, 处理运行错误. Pl/SQL语言基础 sql是关系数据库的基本操作语言. s ...
- PL/SQL编程基础(五):异常处理(EXCEPTION)
异常处理 异常产生所带来的问题: 使用EXCEPTION程序块进行异常处理: 实现用户自定义异常. 使用异常可以保证在程序中出现运行时异常时程序可以正常的执行完毕: 用户可以使用自定义异常进行操作. ...
- PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)
PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...
- PL/SQL编程基础——PL/SQL简介
课程教师:李兴华 课程学习者:阳光罗诺 日期:2018-07-28 知识点: 1. 了解PL/SQL的主要特点 2. 掌握PL/SQL块的基本结构 PL/SQL PL/SQL是Oracle在关系数据库 ...
- Oracle PL/SQL 编程基础 实例
create table mytest(name varchar(20),password varchar(30)); create or replace procedure sp_pro2 is ...
- PL/SQL编程基础(二):变量的声明、赋值、(赋值、连接、关系、逻辑)运算符
变量的声明.赋值.运算符 1.声明并使用变量 变量可以在声明时赋值,也可以先定义后赋值: 使用%TYPE与%ROWTYPE可以根据已有类型定义变量. PL/SQL是一种强类型的编程语言,所有的变量都必 ...
随机推荐
- 终于AC了“最短路径”
今天做了一道关于最短路径的算法题,虽然最后AC了,但是我写的第一个算法,我认为是没有问题的,自己编写的测试用例也全部通过,反复调试了,都没有错误.可是在OJ上一提交就提示Wrong Answer,真是 ...
- MVC中导航菜单,选中项的高亮问题。。
先上图: 这个菜单是放在母板页的.比如当前选中的是异常业务监控.如果页面刷新了.就会变成第一张图..选择其他的选项也会,因为页面会刷新嘛.. 怎么处理这个问题了? 答案是记录当 ...
- 微信绑定用户服务端代码-根据code获取openId然后绑定用户
目录结构: isa.qa.core.weixin.message.resp包和isa.qa.core.weixin.util包中为微信绑定的工具类,就不一一贴出代码,详见附件,下载地址: http:/ ...
- c++ c++ 与 Java
1.c++ c++ 如果1个类的定义中包含另一个类,那么在stdafx.h中 被包含的类必须放在包含类的前面,不然编译器找不到被包含类,c++没有包的概念,所以包含头文件时要注意顺序,而java不存在 ...
- failed to push some refs to 'git@github.com:*/learngit.git'
https://jingyan.baidu.com/article/f3e34a12a25bc8f5ea65354a.html 出现错误的主要原因是github中的README.md文件不在本地代码目 ...
- 0060 Spring MVC的数据类型转换--ConversionService--局部PropertyEditor--全局WebBindingInitializer
浏览器向服务器提交的数据,多是字符串形式,而有些时候,浏览器需要Date.Integer等类型的数据,这时候就需要数据类型的转换器 使用Spring的ConversionService及转换器接口 下 ...
- Leetcode: mimimum depth of tree, path sum, path sum II
思路: 简单搜索 总结: dfs 框架 1. 需要打印路径. 在 dfs 函数中假如 vector 变量, 不用 & 修饰的话就不需要 undo 2. 不需要打印路径, 可设置全局变量 ans ...
- window 后台执行 redis(隐藏窗口)
方法是在知乎上看的,链接:https://www.zhihu.com/question/22771030 实现方法是利用一个vbe脚本去运行一个bat脚本,在bat脚本里启动exe软件 PS:要想启动 ...
- scala的基础部分
最近接触到spark,spark又是scala编写的,所以需要学习一下scala. scala是面向对象的,一切皆为对象, 数值,函数都是对象. println("Welcome to th ...
- osgearth将视点绑定到一个节点上
_manip->getSettings()->setTetherMode(osgEarth::Util::EarthManipulator:: TETHER_CENTER ); //设置_ ...





