广告
返回顶部
首页 > 资讯 > 数据库 >9.PL_SQL——PL_SQL中的循环控制语句
  • 679
分享到

9.PL_SQL——PL_SQL中的循环控制语句

2024-04-02 19:04:59 679人浏览 安东尼
摘要

循环是指在程序中重复执行一条或多条语句、PL/sql中的循环主要有三种:           &

循环是指在程序中重复执行一条或多条语句、PL/sql中的循环主要有三种:

                              1.Basic Loop

                              2. FORLoop

                              3.WHILE Loop

 

下面来逐一介绍这三种循环的用法。

 

一、BasicLoops

        基本循环的格式如下:

             

              LOOP

                              statement1

                              ...

                              EXIT [WHENcondition];

              END LOOP;

             

        这里的EXIT是用来退出循环的,如果没有EXIT,则会变成死循环。

 

       下面来看一个小例子:

 

SQL>select location_id, city, country_id fromlocations where country_id = 'CA';

 
LOCATioN_ID CITY                    CO
----------- ------------------------------ 
       1800 Toronto                 CA
       1900 Whitehorse              CA
-- 目前有两条记录


 

SQL>edit 

DECLARE
        v_countryid     locations.country_id%TYPE :='CA';
        v_loc_id        locations.location_id%TYPE;
        v_counter       NUMBER(2) := 1;
        v_new_city      locations.city%TYPE := 'Montreal';
BEGIN
        SELECT MAX(location_id)
        INTO v_loc_id
        FROM locations
        WHERE country_id =v_countryid;
 
        LOOP
            INSERT INTOlocations(location_id, city, country_id)
            VALUES((v_loc_id +v_counter), v_new_city, v_countryid);
            v_counter := v_counter+ 1;
            EXIT WHEN v_counter> 3;
           -- EXIT后面可以加上标签,来指定退出哪一层循环
        END LOOP;
 
        COMMIT;
END;
/

 

SQL>/ 

PL/SQL procedure successfully completed.

 

SQL>select location_id, city, country_id from locations where country_id = 'CA'; 

LOCATION_ID CITY                           CO
----------- ------------------------------ --
       1800 Toronto                        CA
       1900 Whitehorse                     CA
       1901 Montreal                       CA
       1902 Montreal                       CA
       1903 Montreal                       CA            
-- 执行了循环语句后,多了三条记录


 

                

二、WHILE循环

         WHILE循环的格式如下:

 

              WHILE condition LOOP

                              statement1

                              statement2

                              ...

              END LOOP

 

         WHILE循环是指当condition的结果为TRUE时,就执行循环体。它的循环体可以执行0次或多次,比较适用于循环次数不确定的情况。当条件不满足,就会自动退出循环。

         现在使用WHILE循环来改写之前的例子:

 

SQL>edit 

 DECLARE
        v_countryid     locations.country_id%TYPE :='CA';
        v_loc_id        locations.location_id%TYPE;
        v_counter       NUMBER(2) := 1;
        v_new_city      locations.city%TYPE := 'Montreal';
BEGIN
        SELECT MAX(location_id)
        INTO v_loc_id
        FROM locations
        WHERE country_id =v_countryid;
 
        WHILE v_counter <= 3
              -- 使用WHILE,当v_counter小于等于3时就执行下面的语句
        LOOP
            INSERT INTOlocations(location_id, city, country_id)
            VALUES((v_loc_id +v_counter), v_new_city, v_countryid);
            v_counter := v_counter+ 1;
        END LOOP;
              -- 没有循环出口EXIT,当v_counter大于3时会自动退出循环
        COMMIT;
END;
/

                               

SQL>/  

PL/SQL procedure successfully completed.

 

SQL>select location_id, city, country_id from locations where country_id = 'CA';

 

LOCATION_ID CITY                          CO

----------- ------------------------------ --

       1800 Toronto                        CA

       1900 Whitehorse                  CA

       1901 Montreal                       CA

       1902 Montreal                       CA

       1903 Montreal                       CA

       1904 Montreal                       CA

       1905 Montreal                       CA

       1906 Montreal                       CA

 

8 rows selected.

-- 又多了三条记录

 

        如果条件一次都不满足,WHILE循环会出现一次都不执行的情况。

 

三、FOR循环

 

         FOR循环的基本格式为:

 

FORcounter IN [REVERSE]

              -- REVERSE是关键字,表示反过来循环,如从10到1进行循环

               lower_bound..upper_bound LOOP

               --分别是下边界和上边界,变量counter和上下边界都必须是数值型

              statement1

              statement2

              ...

ENDLOOP;

 

          FOR循环多用于循环次数已知的情况,FOR循环不需要专门声明一个变量作为计数器。它的计数器出了FOR循环之后是不可以使用的,如果一定要使用,建议还是专门声明一个计数器。和其他语言的FOR循环不同的是,用户不能自定义步长,如果想自定义步长,可以用基本循环或WHILE循环代替。

         下面用FOR循环来改写之前的例子:

 

SQL>edit

DECLARE
        v_countryid     locations.country_id%TYPE :='CA';
        v_loc_id        locations.location_id%TYPE;
        v_new_city      locations.city%TYPE := 'Montreal';
BEGIN
        SELECT MAX(location_id)
        INTO v_loc_id
        FROM locations
        WHERE country_id =v_countryid;
 
        FOR i IN 1..3
          -- 这里的i不需要在DECLARE部分专门声明,1和3分别是这个循环的下边界和上边界
          --FOR循环的步长是固定的,不能自行定义
        LOOP
            INSERT INTOlocations(location_id, city, country_id)
            VALUES((v_loc_id + i),v_new_city, v_countryid);
        END LOOP;
      --  DBMS_OUTPUT.PUT_LINE('The counter is ' || i);
          -- 第一次执行先打开注解,用来验证计数器出了循环之后的情况。
        COMMIT;
END;
/

 

SQL>/

*
ERROR at line 16:
ORA-06550: line 16, column 44:
PLS-00201: identifier 'I' must be declared
ORA-06550: line 16, column 2:
PL/SQL: Statement ignored
-- 报错是因为计数器i没有声明,因此出了FOR循环就不能使用了。


 

SQL>/

PL/SQL procedure successfully completed.

 

SQL>select location_id, city, country_id from locations where country_id = 'CA';

 

LOCATION_ID CITY                           CO
----------- ------------------------------ --
       1800 Toronto                        CA
       1900 Whitehorse                     CA
       1901 Montreal                       CA
       1902 Montreal                       CA
       1903 Montreal                       CA
       1904 Montreal                       CA
       1905 Montreal                       CA
       1906 Montreal                       CA
       1907 Montreal                       CA
       1908 Montreal                       CA
       1909 Montreal                       CA
 
11 rows selected.
-- 又多了三条记录


 

      FOR循环是比较受欢迎一种循环,因为它的循环次数可控,不过使用FOR循环,需要注意一些基本的规则:

 

A. 计数器counter只能在循环内部引用,它不需要在循环外部定义;

             

B. 不要为计数器counter赋值,它的赋值是自动完成的,但是可以将计数器的值赋值给其他变量;

             

C. 不要使用NULL值作为循环次数的下界和上界;

             

D. 下界和上界可以为非整数,但非整数会被自动计算为整数;

             

E. 加了关键字REVERSE之后表示循环的次数为倒序,即从上界向下界执行,但是即使使用了REVERSE,下界的值仍然应该比上界的值小,下面举个例子来演示REVERSE的用法:

             

          SQL> edit

                             

    BEGIN
         DBMS_OUTPUT.PUT_LINE('--------NORMal--------');
         FORi IN 1..3
         -- 正常顺序
         LOOP
             DBMS_OUTPUT.PUT_LINE('Outputis ' || i);
         ENDLOOP;
               
         DBMS_OUTPUT.PUT_LINE('------Reverse-------');
         FORi IN REVERSE 1..3
         -- 加了关键字REVERSE会逆序执行
         LOOP
             DBMS_OUTPUT.PUT_LINE('Outputis ' || i);
         END LOOP;
               
         DBMS_OUTPUT.PUT_LINE('-----Upperand Lower------');
         FORi IN REVERSE 3..1
         -- 虽然使用了REVERSE关键字,但是下边界比上边界大,会出现不可控的现象
         LOOP
             DBMS_OUTPUT.PUT_LINE('Outputis ' || i);
         END LOOP;
     END;
     /

 

 SQL> /

             

--------Normal--------
Output is 1
Output is 2
Output is 3
------Reverse-------
Output is 3
Output is 2
Output is 1
-----Upper andLower------
--这一段没有执行,因为下界大于上界,会被认为结果为FALSE,故不进循环体。
               
PL/SQL proceduresuccessfully completed.

 

四、循环种类的选择

 

        循环种类的选择应根据实际需要,这里仅提供一些基本的建议:

1. 循环体必须至少执行一次,建议使用Basic LOOP;

2. 先对条件进行判断,以决定循环体执行0次或多次,尤其是循环次数不确定的情况,建议使用WHILE循环;

3. 循环次数已知,建议使用FOR循环。

             

五、循环的嵌套

         循环可以嵌套,但注意嵌套的次数不要过多,最好不要超过3层;使用标签来区分代码块和循环体是个不错的编程习惯;EXIT结合标签使用,可以指定当前循环退出到哪一层循环,下面来看一个小例子:

9.PL_SQL——PL_SQL中的循环控制语句


六、CONTITUE关键字

        CONTITUE是oracle11g中引入的概念,如果数据库的版本是11g以前的,则不能用CONTINUE。

CONTITUE的用法为:

              1. 跳过当前语句,但不退出循环,直接进入下一轮循环;

              2. 它的句法和EXIT一样,可以使用

                              a. CONTINUE

                                   -- 不附加条件

                              b.CONTINUE WHEN condition;

                                  --附加条件

                              c.CONTINUE label

                                  -- 跳转到某一个标签

                             

         在11g以前如果要实现CONTINUE的功能,需要写更为复杂的程序,引入CONTINUE可以的简化程序,提高性能。下面来看一个CONTINUE的例子:

             

SQL>edit

             

DECLARE
        v_total SIMPLE_INTEGER :=0;
BEGIN
        FOR i IN 1..10 LOOP
            v_total := v_total + i;
           DBMS_OUTPUT.PUT_LINE('Total is: ' || v_total);
 
            CONTINUE WHEN i > 5;
              --当i大于5使,跳出当前这一轮循环,进入下一轮循环
            v_total := v_total + i;
           DBMS_OUTPUT.PUT_LINE('Out of Loop Total is' || v_total);
        END LOOP;
END;
/

               

SQL>/

Total is: 1
Out of Loop Total is2
Total is: 4
Out of Loop Total is6
Total is: 9
Out of Loop Total is12
Total is: 16
Out of Loop Total is20
Total is: 25
Out of Loop Total is30
-- i 大于5时跳出当前这一轮循环
Total is: 36
Total is: 43
Total is: 51
Total is: 60
Total is: 70
 
PL/SQL procedure successfully completed.

 

再来看一个CONTINUE和标签结合使用的例子:

 

SQL>edit

DECLARE
       v_total NUMBER := 0;
BEGIN
       <<BeforeTopLoop>>
      FOR i IN 1..10 LOOP
        v_total := v_total+ 1;
        DBMS_OUTPUT.PUT_LINE('---BeforeTopLoop---Total is: ' || v_total);
 
        FOR j IN 1..10 LOOP
          CONTINUE BeforeTopLoop WHEN i + j > 5;
          -- 跳转到标签BeforeTopLoop处
          v_total :=v_total + 1;
          DBMS_OUTPUT.PUT_LINE('---AfterTopLoop---Total is: ' || v_total);
        END LOOP;
      END LOOP;
END;

 

SQL>/

---BeforeTopLoop---Total is: 1
---AfterTopLoop---Total is: 2
---AfterTopLoop---Total is: 3
---AfterTopLoop---Total is: 4
---AfterTopLoop---Total is: 5
---BeforeTopLoop---Total is: 6
---AfterTopLoop---Total is: 7
---AfterTopLoop---Total is: 8
---AfterTopLoop---Total is: 9
---BeforeTopLoop---Total is: 10
---AfterTopLoop---Total is: 11
---AfterTopLoop---Total is: 12
---BeforeTopLoop---Total is: 13
---AfterTopLoop---Total is: 14
---BeforeTopLoop---Total is: 15
---BeforeTopLoop---Total is: 16
---BeforeTopLoop---Total is: 17
---BeforeTopLoop---Total is: 18
---BeforeTopLoop---Total is: 19
---BeforeTopLoop---Total is: 20
 
PL/SQL procedure successfully completed.

再来看一个使用CONTINUE从内层循环跳转到外层循环的例子:

 

SQL>edit

BEGIN
        <<outer>>
        FOR i IN 1..5
        LOOP
            DBMS_OUTPUT.PUT_LINE('Outer index = '|| TO_CHAR(i));
 
            <<inner>>
            FOR j IN 1..5
            
            LOOP
              DBMS_OUTPUT.PUT_LINE('--->Inner index = ' || TO_CHAR(j));
              -- 这条语句不会执行5次,因为每次执行后就会跳出这一层循环
              CONTINUE outer;
              
            END LOOP inner;
        END LOOP outer;
END;

 

SQL>/

Outer index = 1
--->Inner index = 1
Outer index = 2
--->Inner index = 1
Outer index = 3
--->Inner index = 1
Outer index = 4
--->Inner index = 1
Outer index = 5
--->Inner index = 1
 
PL/SQL procedure successfully completed.

             

六、GOTO 语句

          CONTINUE加上标签一起使用,和GoTO语句比较相似。GOTO语句可以无条件跳转到另一个代码块,但该代码块必须和跳转前的代码块处于同一可执行的section(如BEGIN或EXCEPTION部分)中。在实际编程中不建议使用GOTO,因为它不需要条件控制,容易破坏程序的可读性。

下面来看一个GOTO语句的例子:

 

SQL>edit         

BEGIN
    GOTO second_output;
              --直接跳转到标签所在的位置,下面这条语句永远都不是执行
    DBMS_OUTPUT.PUT_LINE('This linewill never execute.');
    <<second_output>>
    DBMS_OUTPUT.PUT_LINE('We arehere!');
END;
/

SQL>/

We are here!
PL/SQL procedure successfully completed.

 

GOTO语句使用时最好加上IF语句设定跳转的条件。


您可能感兴趣的文档:

--结束END--

本文标题: 9.PL_SQL——PL_SQL中的循环控制语句

本文链接: https://www.lsjlt.com/news/51611.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 9.PL_SQL——PL_SQL中的循环控制语句
    循环是指在程序中重复执行一条或多条语句、PL/SQL中的循环主要有三种:           &...
    99+
    2022-10-18
  • 8.PL_SQL——PL_SQL中的条件控制语句
        和大多数程序语言一样,PL/SQL也有控制语句执行的结构,主要包括:       &nb...
    99+
    2022-10-18
  • Golang的循环语句和循环控制语句详解
    目录一、循环语句1. 普通循环1)语法2)举例2. 循环嵌套3. range循环二、循环控制语句1.Break-中断(跳出)循环1)中断(跳出)循环2)指定想中断(跳出)的循环(嵌套...
    99+
    2022-11-12
  • Oracle LOOP循环控制语句
    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列。常用的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。 LOOP...
    99+
    2022-10-18
  • C语言控制语句之 循环
    入口条件循环:while循环 在执行多次循环之前之就已经决定是否执行循环 代码格式: while(关系表达式) 语句 //可以是以分号结尾的简...
    99+
    2022-11-12
  • C语言控制语句中循环的用法
    本篇内容主要讲解“C语言控制语句中循环的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言控制语句中循环的用法”吧!入口条件循环:while循环在执行多次循环之前之就已经决定是否执行循环代...
    99+
    2023-06-20
  • php中的循环控制语句有哪些
    这篇文章给大家介绍php中的循环控制语句有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampServer,WampServe...
    99+
    2023-06-14
  • JavaScript中有哪些循环语句和流程控制语句
    这篇文章将为大家详细讲解有关JavaScript中有哪些循环语句和流程控制语句,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。循环语句众所周知,常用的循环语句...
    99+
    2022-10-19
  • python循环控制之break和continue流程控制语句
    目录1.流程控制语 break1.1while循环1.2for循环二、循环控制语 continue1.流程控制语 break 用于结束整个循环结构,直接退出整个循环 例: 用两种循环...
    99+
    2022-11-13
  • Shell脚本的条件控制和循环语句
    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre...
    99+
    2022-06-04
    语句 脚本 条件
  • python练习之循环控制语句break与continue
    前言: 循环中通过break语句会立刻终止并跳出循环语句。break就像是终止按键,不管执行到哪一步,只要遇到break,不管什么后续步骤,直接跳出当前循环。 例题1:计算阶乘 例...
    99+
    2022-11-11
  • PHP学习笔记:条件语句与循环控制
    【引言】在学习PHP编程语言过程中,条件语句与循环控制是必须掌握的基础知识点。条件语句用于根据不同的情况执行不同的代码,而循环控制则允许我们重复执行一段代码多次。本文将详细介绍PHP中的条件语句与循环控制,并提供具体的代码示例。【一、条件语...
    99+
    2023-10-21
    学习 PHP 条件语句 循环控制
  • Shell脚本中条件控制和循环语句怎么用
    这篇文章主要介绍了Shell脚本中条件控制和循环语句怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。条件判断:if语句语法格式:if [ expres...
    99+
    2023-06-09
  • Oracle存储过程的控制和循环语句有哪些
    本篇内容主要讲解“Oracle存储过程的控制和循环语句有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle存储过程的控制和循环语句有哪些”吧!1、控...
    99+
    2022-10-19
  • Python基础之python循环控制语句break/continue详解
    Python中提供了两个关键字用来控制循环语句,分别是break和continue break在条件成立时,不会执行循环中的后续代码,并且会停止整个循环 continue在条件成立时...
    99+
    2022-11-12
  • 20:python中的循环语句
    问题描述:       求5!。提示:       求5的阶乘,即5*4*3*2*1                             我总觉得不直观,我想最后打印的是形如:5!= 5*4*3*2*1 = 12020.1.1 prin...
    99+
    2023-01-31
    语句 python
  • Shell循环语句及中断语句的使用
    目录for循环语句例题1:批量添加用户例题2:根据IP地址检查主机状态while循环语句例题1 猜价格游戏例题二:批量添加用户until循环语句例题:计算1~50的值中断(break和continue)①break②con...
    99+
    2023-05-12
    Shell循环语句 Shell中断语句
  • shell中的循环语句、判断语句实例
    shell的循环主要有3种,for,while,until shell的分支判断主要有2种,if,case 一,for循环 #!/bin/bash for file in $(ls /tmp/test/m...
    99+
    2022-06-04
    语句 实例 shell
  • Python中的判断语句,循环语句,函数
    目录1. 判断语句1.1 布尔类型和比较运算符1.1.1 布尔类型1.1.2 比较运算符1.2 if 语句1.2.1 if 语句基本格式1.2.2 if else 语句1.2.3 i...
    99+
    2022-11-11
  • VBScript中循环语句的用法
    这篇文章主要讲解了“VBScript中循环语句的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VBScript中循环语句的用法”吧!使用循环语句循环用于重复执行一组语句。循环可分为三类:...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作