Oracle中的循环

news2024/12/23 17:52:27

 

目录

一、简单循环

1.1LOOP 循环语法:

1.2LOOP 循环示例

二、for循环

2.1for循环语法:

2.2for循环示例

三、while循环

3.1while循环语法

3.2while循环示例

四、GOTO 循环

4.1GOTO 循环语法

4.2GOTO 循环示例


    

      在 Oracle 数据库中,提供了多种循环类型用于实现不同的业务逻辑需求。我们可以使用 PL/SQL 中的循环语句来实现反复执行一段代码块的目的。PL/SQL 是一种过程化语言,提供了完善的控制流结构,支持多种循环形式。下面介绍一些常用的循环语句及其语法和示例。

一、简单循环

之所以会被叫做简单循环:因为它仅是以LOOP关键字开始,以END LOOP语句结束。要靠循环体内的EXIT、EXIT WHEN或者RETURN来退出循环(或者有异常抛出)。这种循环为LOOP 循环,是一种无限循环,它会反复执行一个语句块,直到遇到 BREAK 语句为止。LOOP 循环在程序中也通常用于等待某个条件变为真时再退出循环,或者在处理数据集合时用来查找某个特定的记录。

1.1LOOP 循环语法:

LOOP 循环的语法如下:

LOOP
    -- statements to be executed
    EXIT [WHEN condition];
END LOOP;
--简单理解为:
loop
  要执行的语句;        ┐
  exit when 退出条件;  ├循环体
  [要执行的语句;]      ┘
end loop;

EXIT 是一个可选关键字,可以用来指定跳出循环的条件;condition 是一个布尔表达式,当其值为 TRUE 时会导致循环退出。

1.2LOOP 循环示例

下面就是使用 LOOP 循环的一些示例 

示例1.循环打印1-10,代码如下:

declare
v1 number:=0;
begin
  loop
    v1:=v1+1;
    dbms_output.put_line(v1);
    exit when v1=10;
end loop;
end;

输出结果如下:

示例2.循环打印1-10的和,代码如下:

declare
v1 number:=1;--自增
v2 number:=0;--求和
begin
  loop
    v2:=v2+v1;
    dbms_output.put_line(v2);
    exit when v1=10;
    v1:=v1+1;
  end loop;
end;

输出结果如下:

示例3.只打印1-10的和,代码如下:

declare
v1 number:=1;--自增
v2 number:=0;--求和
begin
  loop
    v2:=v2+v1;
    exit when v1=10;
    v1:=v1+1;
  end loop;
   dbms_output.put_line(v2);
end;

输出如下:

示例4. 不换行打印1-10,代码如下:

declare
v1 number:=0;
begin
  loop
    v1:=v1+1;
    dbms_output.put(v1||',');
    exit when v1=10;
end loop;
dbms_output.put_line('');
end;

输出结果如下:

示例5.循环打印1+2+3+4...+10=55这个式子,代码如下:

declare
v1 number:=1;--自增
v2 number:=0;--求和
begin
  loop
    v2:=v2+v1; --求和
    dbms_output.put(v1||'+');    
     v1:=v1+1;--自增
     exit when v1=10;--退出
end loop;
dbms_output.put_line(v1||'='||(v2+v1));
end;

输出结果如下:

示例6.读取一张表中所有员工记录,代码如下:

 DECLARE
    v_empno emp.empno%TYPE;
    v_ename emp.ename%TYPE;
    v_job emp.job%TYPE;
    v_mgr emp.mgr%TYPE;
    v_hiredate emp.hiredate%TYPE;
    v_sal emp.sal%TYPE;
    v_comm emp.comm%TYPE;
    v_deptno emp.deptno%TYPE;

    CURSOR c_emp IS SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno 
    FROM emp;
BEGIN
    OPEN c_emp;
    LOOP
        FETCH c_emp INTO v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno;
        EXIT WHEN c_emp%NOTFOUND;
        -- 在这里可以对每个员工记录进行处理,例如打印或者插入到另一个表中等操作
        DBMS_OUTPUT.PUT_LINE('empno=' || v_empno || ', ename=' || v_ename || ', job=' || v_job || ', mgr=' || v_mgr || ', hiredate=' || v_hiredate || ', sal=' || v_sal || ', comm=' || v_comm || ', deptno=' || v_deptno);
    END LOOP;
    CLOSE c_emp;
END;

上述代码我创建了一个名为 c_emp 的游标,该游标从 emp 表中选择所有员工记录。要知道游标是会遍历表所有行,然后我使用 LOOP 循环和 FETCH 语句来逐行读取游标中的数据,并将其存储到变量中。在每次循环迭代时,我可以对每个员工记录进行处理,例如打印或者插入到另一个表中等操作。最后,我再通过 CLOSE 语句关闭了游标。这里需要注意,使用游标时需要进行显式地打开和关闭操作。下图是输出结果:

示例7.打印九九乘法表,代码如下:

第一种格式对齐代码如下:

begin
  Dbms_Output.put_line('九九乘法表');
  for i in 1..9 loop
  for j in 1..i loop
   dbms_output.put(j||'*'||i||'='|| lpad(i*j,2,0)||' ');
 end loop;
  dbms_output.put_line('');
 end loop;
end;

 输出结果如下:

 第二种代码如下:

declare
  i int:=1;
  j int:=1;
begin
 loop
  loop
   Dbms_Output.put(i||'*'||j||'='||i*j);
   dbms_output.put(' '); 
   j:=j+1;
   exit when j>i; 
   end loop;
   dbms_output.put_line('');
   i:=i+1;
   j:=1;
   exit when i>9;
  end loop;
end;

输出结果如下:

二、for循环

FOR 循环是一种最常见的循环形式,在固定范围内反复执行某些操作,在程序中通常用于遍历一个数据集合或执行指定次数的操作。

2.1for循环语法:

FOR loop_counter IN [REVERSE] low_value..high_value LOOP
    -- statements to be executed
END LOOP;
--简单理解v:
for 变量 in [reverse]小值..大值 loop  --(两值之间要有两个点,不能多不能少)
  要执行的语句;
  [exit when 中途退出的条件;]
end loop;

·加上reverse是从大值循环到小值

其中,loop_counter 为循环计数器,它可以是任何用户定义的变量或标识符;low_valuehigh_value 表示循环计数器的起始值和终止值;REVERSE 为可选关键字,表示倒序循环。

2.2for循环示例

示例1.循环打印1-10,代码如下:

begin
  for i in  1..10 loop
    dbms_output.put_line(i);
  end loop;
end;

输出结果如下: 

 示例2.循环打印1+2+3+4...+10=55这个式子,代码如下:

declare
v2 int:=0;
begin
  for a in 1..9 loop
    v2:=v2+a;
   dbms_output.put(a||'+');
  end loop;
  dbms_output.put_line('10='||(v2+10));
end;

输出结果如下:

示例3.打印直角三角形,如下图所示,

 

 代码如下:

begin
  for i in 1..5 loop--控制层数
    for j in 1..i loop--控制每一层的星数
      dbms_output.put('* ');
    end loop;
    dbms_output.put_line('');
  end loop;
end;

输出结果和上图一致。

示例4.打印九九乘法表,代码如下:

begin
  for i in 1..9 loop
    for j in 1..i loop
      dbms_output.put(j||'×'||i||'='||j*i||'     ');
    end loop;
       dbms_output.put_line('');
    end loop;
 end;

输出结果如下:

三、while循环

WHILE 循环是一种基于条件表达式的循环结构,只要条件表达式的结果为 TRUE,则会一直执行循环内的语句,直到条件变为 FALSE 才停止循环。也就是说它会根据指定条件重复执行某一段代码,直到条件不成立为止。

3.1while循环语法

其基本语法如下:

WHILE condition LOOP
    -- statements to be executed
END LOOP;
--简单理解v:
while 条件 --进入循环的条件
  loop
    要执行的语句;
    [exit when 退出条件;]--中途退出的条件
end loop;

其中,condition 是一个布尔表达式,当其值为 TRUE 时会执行循环内的语句。

3.2while循环示例

示例1.循环打印1-10,代码如下:

declare 
v1 int:=1;
begin
  while v1<=10 loop
    dbms_output.put_line(v1);
    --exit when v1=5;
    v1:=v1+1;
  end loop;
end;

输出结果如下:

示例2.循环打印1+2+3+4...+10=55这个式子,代码如下:

declare 
v1 int:=1;
v2 int:=0;
begin
  while v1<10 loop
    v2:=v2+v1;
    dbms_output.put(v1||'+');
    v1:=v1+1;
  end loop;
  dbms_output.put_line('10='||(v2+v1));
end;

输出结果如下:

 示例3.打印九九乘法表,代码如下:

declare 
i int:=1;
j int:=1;
begin
 while i<=9 loop j:=1;
   while j<=i loop
   Dbms_Output.put(i||'*'||j||'='||i*j);
   dbms_output.put(' ');
    j:=j+1;
 end loop;
  dbms_output.new_line;
  i:=i+1;
 end loop;
end;

输出结果如下:

四、GOTO 循环

GOTO 循环是一种标签控制形式,是一种无条件转移语句,用于跳转到程序中的指定标签位置。在指定标签前置了符号“:”后,通过 GOTO+标签名 的方式实现循环。

4.1GOTO 循环语法

其基本语法如下:

<<label>>
WHILE condition LOOP
  statement;
  [EXIT | EXIT WHEN condition];
  -- 跳转至标签位置
  GOTO label;
END LOOP;

其中 label 是循环名称,condition 和 statement 同 WHILE 循环的定义。如果要退出循环,可以使用 BREAK 语句或者在 loop 开始位置放置 EXIT 语句。

4.2GOTO 循环示例

示例1.循环打印1到10,代码如下:

DECLARE
  i NUMBER := 1;
BEGIN
  <<my_loop>> -- 声明标记名称my_loop
  IF i <= 10 THEN
    DBMS_OUTPUT.PUT_LINE(i);
    i := i + 1;
    GOTO my_loop; -- 跳转到标记名称为my_loop的位置
  END IF;
END;

输出结果如下:

示例2.打印九九乘法表,代码如下:

DECLARE
  i NUMBER := 1;
  j NUMBER := 1;
BEGIN
  <<my_loop1>> -- 标记名称为 my_loop1
  IF i <= 9 THEN 
    <<my_loop2>> -- 标记名称为 my_loop2
    IF j <= i THEN
      DBMS_OUTPUT.PUT(i || '*' || j || '=' || i*j || ' ');
      j := j + 1;
      GOTO my_loop2; -- 转移到标记名称为 my_loop2 的位置
    ELSE
      DBMS_OUTPUT.NEW_LINE;  -- 换行
      j := 1;
      i := i + 1;
      GOTO my_loop1; -- 转移到标记名称为 my_loop1 的位置
    END IF;
  END IF;
END;

日常情况使用goto循环的情况会比较少,我解释下上面的代码:在上述代码中,首先初始化变量 ij 并声明两个标记名称 my_loop1my_loop2。然后,在第一层循环中,检查 i 的值是否小于等于 9。如果是,则进入第二层循环,检查 j 的值是否小于等于 i。如果是,则使用 DBMS_OUTPUT.PUT_LINE 函数输出乘法表的一项,并将变量 j 加 1。接着使用 GOTO 语句跳转到第二层循环的最开始位置(即标记名称为 my_loop2 的地方),继续执行乘法表循环。如果 j 的值大于 i,则输出一个空行,并将变量 j 重置为 1,将 i 加 1。然后使用 GOTO 语句跳转到第一层循环的最开始位置(即标记名称为 my_loop1 的地方),继续执行乘法表循环。

最后输出结果如下:

 注意:

       GOTO 循环是基于 PL/SQL 语言的特性,在 Oracle 数据库的多个版本中都支持。

具体地说,GOTO 循环是在 Oracle Database 11g Release 2 和之后版本中引入的新特性。         如果使用的是 Oracle 数据库较老的版本,可能不支持该特性。

       虽然使用 GOTO 可以实现类似于循环的功能,但是它也可能会影响代码的可读性和维护性,代码设计时应优先考虑使用更好的循环结构方式(如WHILE循环、FOR循环等)来实现控制流程。同时,为了提高代码执行效率,应当尽量避免在PL/SQL中过度使用 GOTO 语句。

       在PL/SQL中,GO和CONTINUE语句可以使用类似的方式来实现迭代。通常情况下,使用带有明确退出条件的循环比使用GOTO更容易理解和调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

储能之动力电池与储能电池区别?

储能之动力电池与储能电池区别 1、概念1.1 动力电池1.2 储能电池 2、应用场景3、动力电池与储能电池的对比3.1 性能要求3.2 循环次数3.3 电池类型方面3.4 成本结构不同 1、概念 1.1 动力电池 动力电池即为工具提供动力来源的电源&#xff0c;多指为电动汽车、电动列车、电动自…

Oracle中ORA-12560:协议适配器错误

平时在长时间未登录Oracle数据库&#xff0c;再次登录时会出现如下错误&#xff1a; 当Oracle登录时出现12560协议适配器错误时&#xff0c;可以通过以下步骤尝试启动相应的服务&#xff1a; 第一步&#xff1a; 打开本地【服务】&#xff0c;点击最顶层的名称输入【O】&…

java-字符流和字节流(三)

java-字符流和字节流(三) 一、IO特殊操作流 1.1 标准流 1.1.1 标准输入流 System类中有两个静态的成员变量 public static final InputStream in&#xff1a;标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out&am…

【StringBuilder类】添加和反转方法以及StringBuilder和String相互转换

StringBuilder类 如果对字符串进行拼接操作&#xff0c;每次拼接都会构建一个新的String对象&#xff0c;既耗时又浪费内存空间&#xff0c;而这种操作还不可避免。我们可以通过Java提供的StringBuilder类来解决这个问题。StringBuilder是一个可变的字符串类&#xff0c;我们可…

java-基础语法(一)

java-基础语法(一) 一、java变量 1.1、注释 单行注释 // // 这是单行注释文字多行注释 /* *//* 这是多行注释文字 这是多行注释文字 这是多行注释文字 */ 注意&#xff1a;多行注释不能嵌套使用。1.2 常量 常量&#xff1a;在程序运行过程中&#xff0c;其值不可以发生改变的…

Arthas-monitor/watch/trace 相关命令使用

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 开头&#xff1a; 本章所有的命令都非常重要&#xff0c;都是使用率相当高的。 文章目录 moni…

python---列表

列表 1. 列表的介绍1.1 访问列表元素1.2 索引从0而不是1开始1.3 使用列表中的各个值1.4 修改、添加和删除元素1.4.1 修改列表元素 1.5 在列表中添加元素1.5.1 在列表末尾添加元素1.5.2 在列表中插入元素 1.6 从列表中删除元素1.6.1 使用方法pop()删除元素1.6.2 弹出列表中任何位…

【TreeSet集合】自然排序Comparator的使用

自然排序Comparator的使用 存储学生对象并遍历&#xff0c;创建TreeSet集合使用无参构造方法 要求&#xff1a;按照年龄从小到大排序&#xff0c;年龄相同时&#xff0c;按照姓名的字母顺序排序 创建学生类&#xff1a; package com.gather.set.treeset; public class Student…

【利用AI让知识体系化】前端开发学习了解业务架构

文章目录 I. 前端技术入门1.1 HTML/CSS/Javascript 简介1.2 前端框架 React/Vue/Angular 了解1.3 前端工具 Git/Webpack/npm/yarn 的使用1.4 前端调试和性能优化技巧 II. 开发综合应用2.1 工程化开发的全流程2.2 单页面应用 (SPA)2.3 数据交互和批量操作2.4 模块化和组件化开发…

压缩感知重构之匹配追踪算法

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…

[golang 微服务] 4. gRPC介绍,Protobuf结合gRPC 创建微服务

一.gRPC框架的介绍 简介 gRPC是一个 高性能、 开源和 通用的 RPC 框架&#xff0c; 面向移动端和 HTTP/2 设计,目前提供 C、Java 和 Go语言版本&#xff0c;分别是&#xff1a;grpc, grpc-java, grpc-go,其中 C 版本支持 C, C, Node.js, Python, Ruby, Objective-C, PHP 和 C# …

Windows Pyqt5配置环境过程(pycharm Anaconda)

必要安装 Anaconda下载地址 Pycharm下载地址 这两个推荐2019年左右的版本就行了&#xff0c;安装的时候选择“add path” Anaconda换源 换源之后叉掉终端之后再创建环境 Anaconda常用命令 Anaconda换源应该是只对conda install 有用&#xff0c;pip还要换源 使用清华源进行…

java-集合

java-集合 一、集合体系结构 集合类的特点 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变 集合类的体系图 ​ 二、单列集合 2.1 Collection集合&#xff08;接口&#xff09; Collection集合概述 是单列集合的顶层接口&#xff0c;它表示一…

汇编栈寄存器SS与SP使用

入栈时,栈段地址与偏移地址计算 使用a命令输入下面汇编,然后使用u命令查看 写入汇编指令到内存 修改CS:IP指向当前代码段 使用t命令执行汇编指令,详细执行如下图标号 注意每行指令执行后寄存器变化. 取内存段单元数据 将内存段单元数据送入寄存器, 多次送入数据到同一寄存…

chatgpt赋能python:Python分词处理的重要性

Python分词处理的重要性 随着互联网的飞速发展&#xff0c;大数据的普及与应用越来越广泛。人们需要从海量的数据中找到自己需要的信息。因此&#xff0c;自然语言处理技术被广泛应用&#xff0c;其中分词技术是自然语言处理中最基础的一项技术。 在这个领域中&#xff0c;Py…

JS逆向——借助playwright实现逆向

原理&#xff1a; 1.修改js文件&#xff0c;将加密方法设定为全局变量并调用。 2.使用playwright替换浏览器加载的js文件 3.在python中通过playwright实现js注入获取加密结果 实现&#xff1a; 以下面链接为例&#xff1a; Scrape | Movie 1.首先&#xff0c;要知道页面…

方法引用相关知识点

这里写目录标题 方法引用方法引用符简介代码演示 Lambda表达式支持的方法引用引用 类方法简介使用 引用对象的实例方法简介操作 引用类的实例方法简介具体代码 引用构造器简介代码演示 二级目录二级目录二级目录二级目录二级目录二级目录 方法引用 方法引用符 简介 注意 这里…

JDK SPI、Spring SPI、Dubbo SPI三种机制的细节与演化

JDK SPI、Spring SPI、Dubbo SPI三种机制的细节与演化 SPI机制 SPI机制的应用 JDBC中加载驱动 Spring SPI Dubbo SPI SPI深入理解 API与SPI的区别 ServiceLoader JDK SPI、Spring SPI、Dubbo SPI综合对比 SPI机制 Java SPI&#xff08;Service Provider Interface&am…

Linux4.3Apache配置与应用

文章目录 计算机系统5G云计算第一章 LINUX Apache配置与应用及网页优化一、构建虚拟 Web 主机二、基于域名的虚拟主机1.为虚拟主机提供域名解析2.为虚拟主机准备网页文档3.添加虚拟主机配置4.设置访问控制5.Options指令解释6.AllowOverride指令解释7.地址限制策略8.加载独立的配…

10个Chatgpt国内可用镜像网页

自 2022 年底推出以来&#xff0c; ChatGPT一直风靡全球&#xff0c;原因显而易见。革命性的聊天机器人 AI 可以完成数量惊人的任务&#xff0c;从进行对话到撰写整篇学期论文。此外&#xff0c;ChatGPT 可以做很多您不知道的事情——从制作品牌徽标到创作音乐等等。 根据Open…