程序控制

  • 程序结构有分支结构与循环结构;
  • 分支结构语法: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;

/

用户输入一个雇员编号,根据它所在的部门给上涨工资,规则:

  • 10部门上涨10%,20上涨20%,30上涨30%;
  • 但是要求最高不能超过5000,超过5000就停留在5000。

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控制循环操作

单行函数-数值函数-取模

MOD(数字,数字)

取模,求余数

SQL> SELECT MOD(10,3) FROM DUAL;

MOD(10,3)

----------

1

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)的更多相关文章

  1. Oracle数据库编程:PL/SQL编程基础

    2.PL/SQL编程基础: PL/SQL块:        declare        定义部分        begin        执行部分        exception        异 ...

  2. 【PL/SQL编程基础】

    [PL/SQL编程基础]语法: declare 声明部分,例如定义变量.常量.游标 begin 程序编写,SQL语句 exception 处理异常 end: / 正斜杠表示执行程序快范例 -- Cre ...

  3. PL/SQL编程基础(三):数据类型划分

    数据类型划分 在Oracle之中所提供的数据类型,一共分为四类: 标量类型(SCALAR,或称基本数据类型) 用于保存单个值,例如:字符串.数字.日期.布尔: 标量类型只是作为单一类型的数据存在,有的 ...

  4. Oracle Pl/SQL编程基础

    Pl/SQL简介 提高应用程序的运行性能, 提供模块化的程序设计, 自定义标示符, 具有过程语言控制结构, 良好的兼容性, 处理运行错误. Pl/SQL语言基础 sql是关系数据库的基本操作语言. s ...

  5. PL/SQL编程基础(五):异常处理(EXCEPTION)

    异常处理 异常产生所带来的问题: 使用EXCEPTION程序块进行异常处理: 实现用户自定义异常. 使用异常可以保证在程序中出现运行时异常时程序可以正常的执行完毕: 用户可以使用自定义异常进行操作. ...

  6. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  7. PL/SQL编程基础——PL/SQL简介

    课程教师:李兴华 课程学习者:阳光罗诺 日期:2018-07-28 知识点: 1. 了解PL/SQL的主要特点 2. 掌握PL/SQL块的基本结构 PL/SQL PL/SQL是Oracle在关系数据库 ...

  8. Oracle PL/SQL 编程基础 实例

    create table mytest(name varchar(20),password varchar(30)); create or replace procedure sp_pro2 is  ...

  9. PL/SQL编程基础(二):变量的声明、赋值、(赋值、连接、关系、逻辑)运算符

    变量的声明.赋值.运算符 1.声明并使用变量 变量可以在声明时赋值,也可以先定义后赋值: 使用%TYPE与%ROWTYPE可以根据已有类型定义变量. PL/SQL是一种强类型的编程语言,所有的变量都必 ...

随机推荐

  1. ARP协议相关介绍

    什么是ARP协议? ARP,即地址解析协议,实现通过IP地址得知其物理地址.在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址.为了让报文 ...

  2. Ubuntu adb devices : no permissions 解决方法

    ntun下USB连接Android手机后,使用adb devices 出现如下: List of devices attached ???????????? no permissions 同时在DDM ...

  3. Centos下查看和修改网卡Mac地址

    linux/Centos下查看网卡Mac地址,输入命令: #ifconfig -a eth0 Link encap:Ethernet HWaddr 00:e4:56:2E:D8:20 00:e4:56 ...

  4. 【Java面试题】50 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

    1.对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况. 通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象.通过这种方式确定哪些对象是"可达的&q ...

  5. thinkphp模板中无法给自定义函数传多个参数

    1.模板的用法 {:function(param1,param2,param3...)} 2.实例 <td>{:getChannelInfo($adminId,$v['sale_id']) ...

  6. xml & < 需要转义

    写了个request2XML的方法,每当数据中有'<'.'&'符号时,封装的XML就无法解析.发现了XML里的CDATA属性,问题迎刃而解!在XML文档中的所有文本都会被解析器解析. 只 ...

  7. [转] web_reg_save_param得到的数组的处理

    方法一: 函数(sprintf,web_reg_save_param),其中红色字体是本文档最重要的#include "web_api.h" Action(){int i,iloo ...

  8. jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Makefile--伪目标 (三)

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一般情况下,Makefile都会有一个clean目标,用于清除编译过程中产生的二进制文件.我们在 ...

  10. 【RF库Collections测试】Dictionary Should Contain Value

    Name:Dictionary Should Contain ValueSource:Collections <test library>Arguments:[ dictionary | ...