程序控制

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

/

最新文章

  1. c++2008 并行配置文件和获取字典的所有key的方法
  2. Android监听来电和去电
  3. 记”Uri.IsWellFormedUriString”中的BUG
  4. linux根分区扩容
  5. java面向对象编程——第五章 对象的行为
  6. Spring3 报org.aopalliance.intercept.MethodInterceptor问题解决方法
  7. hdu 3929 Big Coefficients 容斥原理
  8. UVA 1474 Evacuation Plan
  9. HTMl5的sessionStorage和localStorage(转)
  10. UIColor,CGColor,CIColor三者间的区别和联系
  11. Spring定时器实现(二)
  12. Cocoapods使用过程中遇到的问题
  13. eclipse构建maven+scala+spark工程
  14. 在windows 10下安装python
  15. WebRTC 音频采样算法 附完整C++示例代码
  16. PYTHON-函数的定义与调用,返回值,和参数-练习
  17. reload maven project&#39; has encountered a proble&quot; 问题
  18. UNIX网络编程 第1章:简介和TCP/IP
  19. AWS系列-使用Could Events定时对EC2打快照
  20. 1. DataBinding - offical tutorial

热门文章

  1. eclipse项目配置tomcat后浏览器访问不到项目解决方案
  2. js中的var
  3. iOS 图片切片的简单实现
  4. Eclipse的调试功能的10个小窍门
  5. 好的 Web 前端年薪会有多少?
  6. NHibernate初学三之条件查询(Criteria Queries)与AspNetPager分页实例
  7. python 数据类型详解(转)
  8. python2.0_day18_Django自带的用户认证模块的使用
  9. 微信移动端(wap)开发调试工具
  10. Python3 requests 库