本节要点:

  • l  选择结构控制语句

    • if条件控制语句
    • Case语句
  • l  循环结构控制语句
    • 基本loop循环
    • for循环
    • while循环
    • 嵌套循环

PL/SQL既然是面向过程的编程语言,那么它就有针对逻辑的控制语句,这些语句在日常的PL/SQL编程中起着很重要的作用,可以完成业务逻辑的框架部分。下面就来介绍PL/SQL的逻辑控制语句。

1         选择结构控制语句

1.1         If条件控制语句

条件控制语句就是根据当前某个参数的值来判断进入哪一个流程,这就好像做选择题一样,当满足某个条件时就进入对应的流程,否则进入另一个流程。

语法:

IF condition THEN

statements;

[ELSIF condition THEN

statements;]

[ELSE

statements;]

END IF;

  • l  在IF语句中,唯一一个必需的子句是IF子句。IF子句指出了要想执行THEN关键字之后列出的语句所必须满足的条件。如果这个条件计算为FALSE,并且提供了第一个ELSIF条件,那么Oracle将转到这个条件。
  • l  ELSIF子句用来指出在随后的条件得到满足时应该执行的另一个操作过程或一组语句。如果在ELSIF关键字之后列出的条件计算为TRUE,那么将执行在随后的THEN关键字之后列出的语句。
  • l  如果在IF和ELSIF子句中提供的条件都是FALSE,将自动执行ELSE子句中提供的任何语句。
  • l  IF语句总是以END IF关键字结束。

注意:ELSIF子句的关键字是一个单词,不能写成“ELSEIF”或“ELSE IF”

示例:编写PL/SQL语句块,根据所购买图书的零售价,然后确定在发货时应该包括的礼品。

DECLARE

v_gift VARCHAR2(20);

c_retailprice NUMBER(5,2):=&price;

BEGIN

IF c_retailprice>56 THEN

v_gift:='FREE SHIPPING';

ELSIF c_retailprice>25 THEN

v_gift:='BOOKCOVER';

ELSIF c_retailprice>12 THEN

v_gift:='BOX OF BOOK LABELS';

ELSE

v_gift:='BOOKMARKER';

END IF;

DBMS_OUTPUT.PUT_LINE('The gift for a book costing '||c_retailprice||' is a '||v_gift);

END

示例:请按以下对应关系,根据成绩的不同,打印出对应的级别

                >90    A

>80    B

>70    C

>=60   D

<60    E

DECLARE

v_grade VARCHAR2(20);

c_score NUMBER(5, 2) := &score;

BEGIN

IF c_score > 90 THEN

v_grade := 'A';

ELSIF c_score > 80 THEN

v_grade := 'B';

ELSIF c_score > 70 THEN

v_grade := 'C';

ELSIF c_score >= 60 THEN

v_grade := 'D';

ELSIF c_score < 60 THEN

v_grade := 'E';

ELSE

v_grade := 'Error put in';

END IF;

DBMS_OUTPUT.PUT_LINE('The grade is ' || v_grade);

END;

1.2         CASE语句

CASE语句同IF语句类似,也是根据条件选择对应的语句执行。

语法:

CASE selector

WHEN expression1 THEN result1

WHEN expression2 THEN result2

WHEN expressionN THEN resultN

[ ELSE resultN+1]

END;

示例:根据不同的输入打印不同的信息

DECLARE

v_grade     char(1) := UPPER('&p_grade');

v_appraisal VARCHAR2(20);

BEGIN

v_appraisal := CASE v_grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Very Good' WHEN 'C' THEN 'Good' ELSE 'No such grade' END;

DBMS_OUTPUT.PUT_LINE(' Grade: ' || v_grade || ' Appraisal: ' ||

v_appraisal);

END;

2         循环结构控制语句

希望反复执行PL/SQL块的可执行部分中的语句。创建一个循环,其中包括要执行的语句,这个循环一直重复,直到满足某个条件为止,这时将会退出循环。有三种类型的循环,你可以在PL/SQL块的可执行部分使用它们,以便重复执行一组语句:

  • l  基本loop循环
  • l  FOR循环
  • l  WHILE循环

2.1         基本loop循环

语法:

LOOP

statements;

EXIT [WHEN condition];

END LOOP;

  • l  基本loop循环用来执行循环语句,直到满足了EXIT子句指定的条件为止。
  • l  根据指定的条件,执行循环的次数在各次执行时可能是不同的。
  • l  LOOP关键字指出循环的开始,END LOOP指出循环的结束。LOOP与END LOOP之间的所有语句将一直重复执行,直到退出循环为止。
  • l  EXIT关键字指出应该何时退出循环。

注意:因为要执行的语句之后列出了EXIT的关键字,所以循环中任何语句至少自动执行一次。这被称为“后测试”(post-test)。在执行语句之后,将评估EXIT子句中列出的任何条件,如果添加为TRUE,那么循环将会结束,然后将执行PL/SQL块的其余部分。

示例:创建一个打印一系列数字的循环。

DECLARE

v_counter NUMBER(1) := 0;

BEGIN

LOOP

v_counter := v_counter + 1;

DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||

v_counter);

EXIT WHEN v_counter = 4;

END LOOP;

END;

示例:打印1-10之间的偶数

DECLARE

v_counter NUMBER(2) := 1;

BEGIN

LOOP

if mod(v_counter, 2) = 0 then

DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' ||

v_counter);

end if;

v_counter := v_counter + 1;

EXIT WHEN v_counter > 10;

END LOOP;

END;

2.2         for循环

语法:

FOR counter IN[REVERSE] lower_limit..upper_limit LOOP

statements;

END LOOP;

  • l  FOR循环也使用一个计数器控制循环的执行次数
  • l  计数器不是一个必须在PL/SQL块的声明部分声明的变量。在第一次执行LOOP时,将隐含声明计数器
  • l  FOR子句要求用户指出计数器的上限和下限。也即,必须指定计数器的初始值(lower_limit)以及终止循环的值(upper_limit)。
  • l  在每一次执行循环时,计数器都将增加1。到达定义为计数器上限的值之后,就将退出这个循环。
  • l  如果在这个子句中包括了REVERSE关键字,那么计数器可以采取相反的方式(计数器减少)

示例:FOR循环使用i作为循环计数器,IN关键字指定范围

BEGIN

FOR I IN 1 .. 10 LOOP

DBMS_OUTPUT.PUT_LINE('The current value of the counter is ' || i);

END LOOP;

END;

2.3         while循环

执行一系列语句,直到条件变为FALSE为止。与前面循环不同,如果条件最初为FALSE,那么永远不能进入这个循环。 在WHILE子句提供的条件决定了循环将在何时终止。

语法:

WHILE condition LOOP

statements;

END LOOP;

示例:PL/SQL块中使用WHILE循环来显示变量的值,直到指定的条件为FALSE为止。

DECLARE

v_counter NUMBER(2):=0;

BEGIN

WHILE v_counter<15 LOOP

DBMS_OUTPUT.PUT_LINE('The current  value of the counter is '||v_counter);

v_counter:=v_counter+1;

END LOOP;

END;

示例:请打印出1~10之间的偶数(注:请用While loop的语法实现)

DECLARE

v_counter NUMBER(2) := 1;

BEGIN

WHILE v_counter <= 10 LOOP

if mod(v_counter, 2) = 0 then

DBMS_OUTPUT.PUT_LINE('The current  value of the counter is ' ||v_counter);

end if;

v_counter := v_counter + 1;

END LOOP;

END;

2.4         嵌套循环

任何类型的循环都可以嵌套在另一个循环中。

注意:在控制返回外部循环之前,必须完成内部循环的执行。在控制返回循环之后,只要外部循环的条件有效,就会再次执行外部循环,这包括了内部循环的执行。这个过程将一直继续,直到外部循环结束为止。

示例:PL/SQL块包含了一个嵌套的FOR循环

DECLARE

v_counter NUMBER(2):=0;

BEGIN

WHILE v_counter<3 LOOP

FOR i IN 1..2 LOOP

DBMS_OUTPUT.PUT_LINE('The current value of the FOR LOOP counter is '||i);

END LOOP;

DBMS_OUTPUT.PUT_LINE('The current value of the WHILE counter is '||v_counter);

v_counter:=v_counter+1;

END LOOP;

END;

PL/SQL控制语句的更多相关文章

  1. orcale 之PL/SQL 控制语句

    控制语句是PL/SQL 的关键所在.只有学好这些控制语句才能在工作中更好的实现各种的功能. 选择结构 1. IF 语句 和其他的编程语言很类似.它的具体机构如下: IF(条件)THEN {语句} EL ...

  2. PL/SQL控制语句(二、循环控制语句)

    循环允许重复执行代码直到循环条件匹配,PL/SQL中循环主要有LOOP语句和EXIT语句两种,这两种语句相辅相成,一起组成了PL/SQL的循环结构.在PL/SQL中,循环分为四大类,本文将会讲解其中的 ...

  3. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  4. 第三章 PL/SQL编程

    3.1 PL/SQL基础知识    3.1.1 什么是PL/SQL?        PL/SQL是结合Oracle过程语言和结构化查询语言的一种扩展语言        3.1.1.1 PL/SQL体系 ...

  5. Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012

    \t第1篇 pl/sql开发入门第1章 oracle 11g数据库系统1.1 关系型数据库系统介绍1.1.1 什么是关系型数据模型1.1.2 数据库系统范式1.1.3 关系型数据库管理系统1.1.4 ...

  6. Oracle之PL/SQL编程

    PL/SQL(Procedural Language/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点, ...

  7. PL/SQL流程控制语句

    PL/SQL流程控制语句介绍PL/SQL的流程控制语句, 包括如下三类:控制语句: IF 语句循环语句: LOOP语句, EXIT语句顺序语句: GOTO语句, NULL语句①if语句 IF < ...

  8. PL/SQL之--流程控制语句

    一.简介 像编程语言一样,oracle PL/SQL也有自己的流程控制语句.通过流程控制语句,我们可以在PL/SQL中实现一下比较复杂的业务逻辑操作.而无需到程序中去控制,在一定程度上提高了效率,这也 ...

  9. Oracle数据库之PL/SQL流程控制语句

    Oracle数据库之PL/SQL流程控制语句 在任何计算机编程语言(如C,Java,C#等)都有各种流程控制语句,同样,在PL/SQL中也存在这样的流程控制结构. 几种常见的流程控制结构: 一.条件结 ...

随机推荐

  1. ZOJ 1654 Place the Robots(最大匹配)

    Robert is a famous engineer. One day he was given a task by his boss. The background of the task was ...

  2. HDU1561 The more, The Better

    HDU1561 The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  3. Node.js:JXcore

    ylbtech-Node.js:JXcore 1.返回顶部 1. Node.js JXcore 打包 Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一 ...

  4. [.Net] 导出Excel中身份证等数字串的解决方式

    public static void DataTableToExcel(System.Data.DataTable dtData, String FileName) { GridView dgExpo ...

  5. 虚拟机CentOS设置IP

    虚拟机里Centos7的IP地址查看方法 本地虚拟机安装了CentOS 7,想通过ftp上传文件,发现通过ifconfig,没有inet这个属性 查看ens33网卡的配置:vi /etc/syscon ...

  6. php如何将网上的图片下载到本地

    <?phpheader("Content-Type: application/force-download");header("Content-Dispositio ...

  7. Polyfill 与 Shim

    Polyfill 与 Shim polyfill 的概念是 Remy Sharp 在2010年提出的. polyfill,或 polyfiller ,表示为开发人员提供旧浏览器没有原生支持的较新功能的 ...

  8. TopN问题(分别使用Hadoop和Spark实现)

    简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在map阶 ...

  9. [Offer收割]编程练习赛33

    矩阵游戏II 把每列的数字加起来当一行处理.因为每次操作两列,所以最后最多剩下一个负数.如果负数的个数是偶数,直接所有数字的绝对值加起来即可:若负数个数为奇数,把所有数的绝对值加起来减去其中最小的绝对 ...

  10. swiper套路

    swiper插件 quick start 基本结构 <div class="swiper-container"> <div class="swiper- ...