前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试444】Oracle中PL/SQL的流程控制语句包括哪些?

【DB笔试面试444】Oracle中PL/SQL的流程控制语句包括哪些?

作者头像
小麦苗DBA宝典
发布2019-09-30 19:18:40
1.1K0
发布2019-09-30 19:18:40
举报

题目部分

Oracle中PL/SQL的流程控制语句包括哪些?

答案部分

在任何计算机语言(例如C/C++、Java、Pascal、SHELL等)中,都有各种控制语句(条件语句,循环结构,顺序控制结构等),在PL/SQL中也存在这样的控制结构。PL/SQL的流程控制语句包括如下三类:

(1)条件语句:IF语句

(2)循环语句:LOOP语句,EXIT语句

(3)顺序语句:GOTO语句,NULL语句

1 块

PL/SQL(Procedure Language & Structured Query Language)是Oracle在标准的SQL语言上的扩展。PL/SQL不仅允许嵌入SQL语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用异常进行捕获程序中的各种错误,这样使得它的功能变得更加强大。

如果不使用PL/SQL语言,那么Oracle一次只能处理一条SQL语句。每条SQL语句都导致客户向服务器调用,从而在性能上产生很大的开销,尤其是在网络操作中。如果使用PL/SQL,那么一个块中的语句作为一个组,对服务器只有一次调用,可以减少网络传输。

关于程序的形式,可以有如下分类:

(1)无名块:指的是没有命名的PL/SQL块,它可以是嵌入某一个应用之中的一个PL/SQL块。

(2)存储过程/函数:指的是命名了的PL/SQL块,它可以接收参数,并可以重复地被调用。

(3)包:命名了的PL/SQL块,由一组相关的过程、函数和标识符组成。

(4)库触发器:是一个与具体表相关联的存储PL/SQL的程序。每当一个SQL操作影响到该数据库表时,系统就自动执行相应的数据库触发器。每个表最多可以有12个触发器。

一个基本的PL/SQL块由三部分组成:定义部分、可执行部分以及异常处理部分。

(1)定义部分:包含变量、常量和游标的声明。这部分是可选的。

(2)可执行部分:包括对数据进行操作的SQL语句。这部分必须存在。

(3)异常处理部分:对可执行部分中的语句在执行过程中出错时所做出的处理。这部分是可选的。

具体语法形式如下所示:

DECLARE

/*定义部分——定义常量、变量、游标、异常、复杂数据类型*/

BEGIN

/*执行部分——要执行的PL/SQL语句和SQL语句*/

EXCEPTION

/*异常处理部分——处理运行的各种错误*/

END;

在使用PL/SQL的时候,需要注意以下几点内容:

(1)定义部分是从DECLARE开始的,该部分是可选的。

(2)DECLARE里面定义的局部变量用分号隔开。

(3)执行部分是从BEGIN开始的,该部分是必须的。

(4)异常处理部分是从EXCEPTION开始的,该部分是可选的。

(5)END不可缺少。

这里给出一个使用PL/SQL块的例子:

代码语言:javascript
复制
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    V_ENAME VARCHAR2(5);
  3    V_SAL   NUMBER(7,2);
  4  BEGIN
  5    --执行部分
  6    SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM SCOTT.EMP WHERE EMPNO = 7788;
  7    --在控制台显示用户名
  8    DBMS_OUTPUT.PUT_LINE('用户名是:' || V_ENAME || '  工资:' || V_SAL);
  9    --异常处理
 10  EXCEPTION
 11    WHEN NO_DATA_FOUND THEN
 12      DBMS_OUTPUT.PUT_LINE('您的编号输入有误!');
 13  END;
 14  /

用户名是:SCOTT 工资:3000

PL/SQL procedure successfully completed.

上例介绍了最基本的使用方法,若要精通开发,则需要多加练习。

2 分支IF语句

PL/SQL中提供了三种条件分支语句,如下所示:

① IF - THEN - END IF;

② IF - THEN – ELSE - END IF;

③ IF - THEN – ELSIF - THEN - END IF;

下面给出一个使用IF语句的例子。

代码语言:javascript
复制
SYS@LHRDB> SET SERVEROUTPUT ON
SYS@LHRDB> DECLARE
  2    V_SAL SCOTT.EMP.SAL%TYPE := 7788;--工资为7788元
  3  BEGIN
  4  
  5    IF V_SAL < 1500 THEN
  6      DBMS_OUTPUT.PUT_LINE('工资太少了');
  7    ELSIF (V_SAL < 3000 AND V_SAL >= 1500) THEN
  8      DBMS_OUTPUT.PUT_LINE('工资还可以');
  9    ELSIF V_SAL < 5000 THEN
 10      DBMS_OUTPUT.PUT_LINE('工资挺好的');
 11    ELSE
 12      DBMS_OUTPUT.PUT_LINE('工资挺高的');
 13      IF V_SAL < 8000 THEN
 14        DBMS_OUTPUT.PUT_LINE('是什么工作呢?');
 15      ELSE
 16        DBMS_OUTPUT.PUT_LINE('可以推荐我去吗?');
 17      END IF;
 18    END IF;
 19  END;
 20  /

工资挺高的

是什么工作呢?

3 循环

Oracle中的循环有3种结构:LOOP、WHILE和FOR循环。在这3种结构中,最常用的就是FOR了,所以,这种结构一定得掌握。

1、LOOP循环

简单循环语句的一般形式如下所示:

LOOP

要执行的语句;

EXIT WHEN <条件语句> /*条件满足,退出循环语句*/

END LOOP;

其中,EXIT WHEN子句是必须的,否则,循环将无法停止,同时,需要注意的是,该循环是PL/SQL中最简单的循环语句,这种循环语句以LOOP开头,以END LOOP结尾,这种循环至少会被执行一次。

LOOP循环的示例如下所示:

代码语言:javascript
复制
SYS@lhrdb> SET SERVEROUTPUT ON
SYS@lhrdb> DECLARE
  2         V_NUM NUMBER(2) := 0;
  3  BEGIN
  4         LOOP
  5               DBMS_OUTPUT.PUT_LINE(V_NUM);
  6               V_NUM := V_NUM + 1;
  7               EXIT WHEN V_NUM =5;
  8         END LOOP;
  9  END;
 10  /
0
1
2
3
4

2、WHILE循环

WHILE循环语句的一般形式如下所示:

WHILE <布尔表达式> LOOP

要执行的语句;

END LOOP;

其中,循环语句执行的顺序是先判断<布尔表达式>的真假,如果为真,那么循环执行,否则退出循环。在WHILE循环语句中,仍然可以使用EXIT或EXIT WHEN子句。

WHILE循环的示例如下所示:

代码语言:javascript
复制
SYS@lhrdb> SET SERVEROUTPUT ON
SYS@lhrdb> DECLARE
  2         V_SUM NUMBER(3) := 0;
  3         V_NUM NUMBER(2) := 1;
  4  BEGIN
  5         WHILE V_NUM <=5 LOOP
  6               DBMS_OUTPUT.PUT_LINE(V_NUM);
  7               V_SUM := V_SUM + V_NUM;
  8               V_NUM := V_NUM + 1;
  9         END LOOP;
 10         DBMS_OUTPUT.PUT_LINE('SUM IS: ' || V_SUM);
 11         
 12  END;
 13  /
1
2
3
4
5
SUM IS: 15

3、FOR循环

FOR循环语句的一般形式如下所示:

FOR 循环计数器 IN [ REVERSE ] 下限..上限LOOP

要执行的语句;

END LOOP;

其中:

(1)每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。

(2)跟在IN REVERSE 后面的数字必须是从小到大的顺序,但不一定是整数,可以是能够转换成整数的变量或表达式。

(3)可以使用EXIT WHEN子句退出循环。

FOR循环的示例如下所示:

代码语言:javascript
复制
SYS@lhrdb> SET SERVEROUTPUT ON
SYS@lhrdb> DECLARE
  2         V_SUM NUMBER(4) := 0 ;
  3  BEGIN
  4         FOR X IN 1 .. 5 LOOP
  5             DBMS_OUTPUT.PUT_LINE(X);
  6             V_SUM := V_SUM + X;
  7         END LOOP;
  8         DBMS_OUTPUT.PUT_LINE(V_SUM);
  9  END;
 10  /
1
2
3
4
5
15

PL/SQL procedure successfully completed.

代码语言:javascript
复制
SYS@lhrdb> DECLARE
  2  BEGIN
  3         FOR X IN REVERSE (5-6) .. (2*3) LOOP --翻转打印
  4              DBMS_OUTPUT.PUT_LINE(X);
  5         END LOOP;
  6         
  7  END;
  8  /
6
5
4
3
2
1
0
-1

PL/SQL procedure successfully completed.

FOR循环中还有最常用的一种形式是游标FOR循环,下面给出一个例子:

代码语言:javascript
复制
SYS@lhrdb> DECLARE
  2    CURSOR EMP_CUR IS
  3      SELECT * FROM SCOTT.EMP
  4      WHERE ROWNUM<=3;
  5  BEGIN
  6    --FOR本身就包含了打开、关闭游标的过程
  7    FOR EMP_RECORD IN EMP_CUR LOOP
  8      DBMS_OUTPUT.PUT_LINE('NAME IS:' || EMP_RECORD.ENAME || ' AND SAL IS:' ||
  9                           EMP_RECORD.SAL);
 10    END LOOP;
 11  END;
 12  /
NAME IS:SMITH AND SAL IS:800
NAME IS:ALLEN AND SAL IS:1600
NAME IS:WARD AND SAL IS:1250

PL/SQL procedure successfully completed.

4 GOTO语句

GOTO语句用于跳转到特定符号去执行语句。需要注意的是,由于使用GOTO语句会增加程序的复杂性,并使得应用程序可读性变差,所以,在做一般应用开发时,不建议使用GOTO语句。

GOTO语句的基本语法如下:GOTO LABLE,其中,LABLE是已经定义好的标号名。GOTO语句的一般形式如下所示:

GOTO LABEL;

... ...

<<LABEL>> /*标号是用<< >>括起来的标识符*/

其中,GOTO语句是无条件跳转到指定的标号LABEL的意思。以下是GOTO语句的一个例子,在该示例中,判断DBA_JOBS视图中是否含有“WHAT='PH_ALERT_LOG_LHR;'”的记录,若有该条记录,则让程序休眠10秒后继续判断,若没有,则退出GOTO语句。

代码语言:javascript
复制
DECLARE
  V_COUNT NUMBER;
BEGIN
  <<REPEAT_LOOP>>
  SELECT COUNT(1)
    INTO V_COUNT
    FROM DBA_JOBS D
   WHERE D.WHAT = 'PH_ALERT_LOG_LHR;';
  IF V_COUNT > 0 THEN
    SYS.DBMS_LOCK.SLEEP(SECONDS => 10);
    GOTO REPEAT_LOOP;
  END IF;
END;
/

About Me:小麦苗

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 块
  • 2 分支IF语句
  • 3 循环
  • 4 GOTO语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档