Oracle中的循环之FOR循环、WHILE循环和LOOP循环详解

 更新时间:2025年06月09日 10:09:04   作者:雷神乐乐  
这篇文章主要介绍了Oracle中的循环之FOR循环、WHILE循环和LOOP循环的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Oracle中的循环常用的有:FOR循环、WHILE循环和LOOP循环

一、FOR循环

1.FOR循环语法结构

DECLARE   --不声明变量,可以不写
       
BEGIN
  FOR 循环变量 IN  1..10循环下限 .. 循环上限 LOOP ------循环变量 每次自增1
    循环体;
    END LOOP;
END;

示例:循环打印1~10

declare
begin
    for i in 1..10
        loop
            DBMS_OUTPUT.PUT_LINE(i);
        end loop;
end;

示例:用户输入一个数字X,循环打印 1~X

declare
    x number:=:input;
begin
    for i in 1..x
        loop
            DBMS_OUTPUT.PUT_LINE(i);
        end loop;
end;

示例:用户输入一个数字X,打印 1+2+3+..+X 的和是多少

declare
    x number := :input;
    v number := 0;-- 需要有一个变量存放每次累加后的和
begin
    for i in 1..x
        loop
            v := v + i;
        end loop;
    DBMS_OUTPUT.PUT_LINE(v);
end;

计算 1 到 10 的数字中偶数的累加值

declare
    v number := 0;-- 需要有一个变量存放每次累加后的和
begin
    for i in 1..10
        loop
            v := v + i;
        end loop;
    DBMS_OUTPUT.PUT_LINE(v);
end;  -- 55

二、WHILE循环

1.WHILE循环语法结构

DECLARE

BEGIN
  WHILE 进入循环的条件 LOOP
    --循环体
  END LOOP;
END;

示例:循环打印1~10 以及 输出格式:

  • 编码:1
  • 编码:2
  • ...
DECLARE
    v number := 1;  -- 声明循环变量
BEGIN
    WHILE v <= 10
        loop
            DBMS_OUTPUT.PUT_LINE('编码:' || v);
            v := v + 1; -- 自增
        end loop;
end;

示例:打印100以内,所有偶数(大于0 从2开始到100结束)

DECLARE
    v number := 2;
BEGIN
    WHILE v <= 100
        loop
            DBMS_OUTPUT.PUT_LINE(v);
            v := v + 2; -- 自增
        end loop;
end;

示例:接收用户输入的数字 X,判断 X 大于10 则 打印"您输入的值过大,请重新输入!" ,如果不大于10,则打印 X 的阶乘,比如输入 6 ,输出 "6的阶乘为 720"

declare
    x number := :input; -- 输入值
    i number := 1;-- 计数器
    v number := 1;-- 阶乘累加值
begin
    if x > 10 then
        DBMS_OUTPUT.PUT_LINE('您输入的值过大,请重新输入!');
    else
        while i <= x -- 一定是计数器<=输入值(上限)
            loop
                v := v * i;
                i := i + 1;-- 计数器+1
            end loop;
        DBMS_OUTPUT.PUT_LINE(x || '的阶乘为:' || v);
    end if;
end;

综合练习:

分别使用FOR循环和WHILE循环,计算1 到 10 的累加值

-- FOR循环
declare
    v number := 0; -- 存放累加值
begin
    for i in 1..10
        loop
            v := v + i;
        end loop;
    DBMS_OUTPUT.PUT_LINE('1~10的累加值为:' || v);
end;

-- WHILE循环
declare
    i number := 1;-- 存放初始值
    v number := 0; -- 存放累加值
begin
    while i <= 10
        loop
            v := v + i;
            i := i + 1;
        end loop;
    DBMS_OUTPUT.PUT_LINE('1~10的累加值为:' || v);
end;

分别使用FOR循环和WHILE循环,计算1 到 10 偶数的累加值

-- FOR循环
declare
    v number := 0; -- 存放累加值
begin
    for i in 1..10
        loop
            if mod(i, 2) = 0 then
                v := v + i;
            end if;
        end loop;
    DBMS_OUTPUT.PUT_LINE('1~10的偶数累加值为:' || v);
end;

-- WHILE循环
declare
    i number := 1;-- 存放初始值
    v number := 0; -- 存放累加值
begin
    while i <= 10
        loop
            if mod(i, 2) = 0 then
                v := v + i;
            end if;
            i := i + 1;
        end loop;
    DBMS_OUTPUT.PUT_LINE('1~10的偶数累加值为:' || v);
end;

三、LOOP循环

1.LOOP循环语法结构

DECLARE
  --声明
BEGIN
  LOOP
   ------循环体
    IF 跳出该循环的条件 THEN
      EXIT;
    END IF;
  END LOOP;
END;

-----

DECLARE
  --声明
BEGIN
  LOOP
   ------循环体
    EXIT WHEN 跳出该循环的条件;
  END LOOP;
END;

示例:打印 1 到 100 的数字中偶数

declare
    i number := 2;-- 初始值为2
begin
    loop
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 2;
        if i > 100 then
            exit ;
        end if;
    end loop;
end;


declare
    i number := 2;-- 初始值为2
begin
    loop
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 2;
        exit when i > 100;
    end loop;
end;

练习:计算 1到 10奇数的累加 --loop

declare
    i     number := 1;-- 初始值为1
    v_sum number := 0;-- 存放累加值
begin
    loop
        if mod(i, 2) = 1 then
            v_sum := v_sum + i;
        end if;
        i := i + 1;
        exit when i > 10;
    end loop;
    DBMS_OUTPUT.PUT_LINE('1-10奇数的累加值为:' || v_sum);
end;

-- 方法二
declare
    i     number := 1;-- 初始值为1
    v_sum number := 0;-- 存放累加值
begin
    loop
        v_sum := v_sum + i;
        i := i + 2;
        exit when i > 10;
    end loop;
    DBMS_OUTPUT.PUT_LINE('1-10奇数的累加值为:' || v_sum);
end;

四、三个循环的区别(重要)

1.FOR 循环 不需要设置i自增,因为默认就是自增1

  • FOR i IN 10..100 LOOP
  • 要做的事情
  • END LOOP;

2.WHILE 循环 需要设置变量自增,且循环条件放在 WHILE 后面

  • WHILE 循环的条件(J <=10) LOOP
  • 要做的事情
  • 变量的递增(递减)--变量肯定要重新赋值,不然就是死循环
  • END LOOP;

3.LOOP 循环 需要设置变量自增,且退出循环的条件放到 IF 后

  • LOOP
  • 想做的事情
  • IF 退出循环的场景
THEN EXIT;
END IF;
END LOOP;

假设有100块钱,打算买100只鸡,公鸡一只5元,母鸡一只3元,小鸡3只1元,请问100块钱刚好花完,每种鸡至少买1只,每种鸡各可以买多少?

BEGIN
    FOR g IN 1..20
        LOOP
            FOR m IN 1..33
                LOOP
                    FOR x IN 1..100
                        LOOP
                            IF g + m + x = 100 AND 5 * g + 3 * m + x / 3 = 100 THEN
                                dbms_output.put_line('公鸡:' || g || ' 母鸡:' || m || ' 小鸡:' || x);
                            END IF;
                        END LOOP;
                END LOOP;
        END LOOP;
END;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle创建Database Link的两种方式详解

    Oracle创建Database Link的两种方式详解

    Oracle数据库如何创建Database Link呢?本文我们主要就介绍一下这部分内容,Oracle数据库创建Database Link有两种方式,一种是通过菜单,一种是通过SQL
    2016-02-02
  • Oracle12c图形化&静默安装踩坑的方法步骤

    Oracle12c图形化&静默安装踩坑的方法步骤

    这篇文章主要介绍了Oracle12c图形化&静默安装踩坑的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Oracle中is和as的区别和使用

    Oracle中is和as的区别和使用

    在Oracle数据库中,AS和IS是两个常用的关键字,它们分别表示“命名别名”和“判断是否相同”,AS和IS的主要区别在于它们的功能,AS是一种授权服务,它负责授予和管理用户访问数据库特定对象和操作的权限,IS则是一种身份验证服务,它负责管理用户的身份和访问权限
    2024-01-01
  • oracle中的procedure编写和使用详解

    oracle中的procedure编写和使用详解

    这篇文章主要介绍了oracle中的procedure编写和使用详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Oracle常见错误代码的分析与解决

    Oracle常见错误代码的分析与解决

    Oracle常见错误代码的分析与解决...
    2007-03-03
  • Oracle数据库的实例/表空间/用户/表之间关系简单讲解

    Oracle数据库的实例/表空间/用户/表之间关系简单讲解

    这篇文章主要介绍了Oracle数据库的实例/表空间/用户/表之间关系简单讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • ORCAL 临时创建表与删除表

    ORCAL 临时创建表与删除表

    今天这篇文章就来给大家分享ORCAL 临时创建表与删除表的相关资料,如会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。下面就跟小编一起进入文章学习起来吧
    2021-10-10
  • ORACLE实现自定义序列号生成的方法

    ORACLE实现自定义序列号生成的方法

    这篇文章主要为大家详细介绍了ORACLE实现自定义序列号生成的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Oracle切换为归档模式的步骤及问题解决

    Oracle切换为归档模式的步骤及问题解决

    这篇文章主要介绍了Oracle切换为归档模式的步骤,还有遇到的问题解决方法,大家参考使用吧
    2013-11-11
  • 一文掌握Oracle中的Dual系统表

    一文掌握Oracle中的Dual系统表

    Dual表是Oracle提供的最小的工作表(其实是一种虚拟表),是sys用户下的一张内部表,只有一行一列(一列:DUMMY,一列:DUMMY,其数据类型为:VARCHAR2(1)),接下来通过本文给大家分享Oracle中的Dual系统表,需要的朋友可以参考下
    2022-09-09

最新评论