本节要点:

  • 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. MongoDB 索引的使用, 管理 和优化

    MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报  分类: MongoDB(9)  [使用explain和hint] 前面讲高级查询 ...

  2. 什么是A记录、MX记录、CNAME记录具体介绍

    什么是A记录: A (Address) 记录是用来指定主机名(或域名)相应的IP地址记录.用户能够将该域名下的站点服务器指向到自己的web server上. 同一时候也能够设置域名的子域名. 通俗来说 ...

  3. luogu2441 角色属性树

    题目大意:维护一个可查询.修改的树,查询的是一个节点的:离它距离最近的.组成两个节点Key值的质因数存在交集的.祖先节点:修改是修改一个节点的key值. 如果组成两个Key值的质因数存在交集,则两个数 ...

  4. java怎么学

    java怎么学 给你推荐一个写得非常用心的Java基础教程:Java入门基础教程 | 天码营 这个教程将Java的入门基础知识贯穿在一个实例中,逐步深入,可以帮助你快速进入Java编程的世界.万事开头 ...

  5. Python多线程学习(一、线程的使用)

    Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: import thread de ...

  6. LinkedHashMap做缓存

    项目上需要写一个缓存,这样就不需要频繁地访问数据库,我使用的是 //缓存 private final Map<String, JSONArray> schemaCache = new Li ...

  7. TensorFlow——分布式的TensorFlow运行环境

    当我们在大型的数据集上面进行深度学习的训练时,往往需要大量的运行资源,而且还要花费大量时间才能完成训练. 1.分布式TensorFlow的角色与原理 在分布式的TensorFlow中的角色分配如下: ...

  8. Open CASCADE Technology(OCCT)概述

    OCCT模块结构图 基础类: Foundation Classes module underlies all other OCCT classes; 模型数据: Modeling Data modul ...

  9. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  10. A - Boy or Girl(set)

    Problem description Those days, many boys use beautiful girls' photos as avatars in forums. So it is ...