当前位置: 首页 > news >正文

Oracle23ai新特性FOR LOOP循环控制结构增强

在Oracle数据库中,FOR LOOP是一种常用的循环控制结构,它允许你重复执行一系列语句固定次数或直到满足特定条件为止。然而,标准的Oracle PL/SQL中的FOR LOOP主要用于遍历集合(如数组或游标的结果集),而不是像在一些其他编程语言中那样用于基于条件的循环。

参考官方文档地址
https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-control-statements.html#GUID-0E130F2D-9635-4C0B-9D63-16C3D9FBE7D2

Oracle PL/SQL中的FOR LOOP主要用于以下几种情况:

  1. 基于数值范围的遍历:你可以使用FOR LOOP遍历一个从起始值到结束值的数值序列。

  2. 遍历游标FOR LOOP可以自动从游标中检索行,并允许你在循环体内部访问这些行。

1:基于数值范围的遍历

DECLARE i NUMBER;
BEGINFOR i IN 1..5 LOOPDBMS_OUTPUT.PUT_LINE('i的值为: ' || i);END LOOP;
END;
/

sqlplus执行结果如下

SYS@orcl> set serveroutput on
SYS@orcl> DECLARE i NUMBER;2  BEGIN3      FOR i IN 1..5 LOOP4          DBMS_OUTPUT.PUT_LINE('i的值为: ' || i);5      END LOOP;6  END;7  /
i的值为: 1
i的值为: 2
i的值为: 3
i的值为: 4
i的值为: 5PL/SQL procedure successfully completed.

这个例子中,FOR LOOP会遍历从1到5的整数,并在控制台上打印每个数值。

2:反向循环语句范围迭代控制

The FOR LOOP statement in this example prints the numbers from 5 to 1. The loop variable i is implicitly declared as a PLS_INTEGER (the default for counting and indexing loops).

BEGINFOR i IN REVERSE 1..5 LOOPDBMS_OUTPUT.PUT_LINE ('i的值为: ' ||i);END LOOP;
END;
/ 

Result:

i的值为: 5
i的值为: 4
i的值为: 3
i的值为: 2
i的值为: 1

3:实现带步长的循环

3.1:Oracle23ai新特性FOR i IN … BY … LOOP

This example shows a loop variable n declared explicitly as a NUMBER(5,1). The increment for the counter is 0.5.
这个例子中,展示一个显式声明为NUMBER(5,1)的循环变量n。计数器的步长增量为0.5。

BEGINFOR n NUMBER(5,1) IN 1.0 .. 5.0 BY 0.5 LOOPDBMS_OUTPUT.PUT_LINE('n的值为: ' ||n);END LOOP;
END;
/

Result:

SYS@FREE> BEGIN2     FOR n NUMBER(5,1) IN 1.0 .. 5.0 BY 0.5 LOOP3        DBMS_OUTPUT.PUT_LINE('n的值为: ' ||n);4     END LOOP;5  END;6  /
n的值为: 1
n的值为: 1.5
n的值为: 2
n的值为: 2.5
n的值为: 3
n的值为: 3.5
n的值为: 4
n的值为: 4.5
n的值为: 5PL/SQL procedure successfully completed.

Oracle19c及之前的版本,以上语句执行不了,报错如下

SYS@orcl> BEGIN2     FOR n NUMBER(5,1) IN 1.0 .. 3.0 BY 0.5 LOOP3        DBMS_OUTPUT.PUT_LINE(n);4     END LOOP;5  END;6  /FOR n NUMBER(5,1) IN 1.0 .. 3.0 BY 0.5 LOOP*
ERROR at line 2:
ORA-06550: line 2, column 10:
PLS-00103: Encountered the symbol "NUMBER" when expecting one of the following:
in
The symbol "in" was substituted for "NUMBER" to continue.
ORA-06550: line 2, column 22:
PLS-00103: Encountered the symbol "IN" when expecting one of the following:
. ( * % & - + / at loop mod remainder rem ..
<an exponent (**)> || multiset

3.2:Oracle19c及之前的版本可以采用如下两种方法即可

3.2.1:使用LOOP … EXIT WHEN … END LOOP

SYS@FREE> DECLARE i NUMBER(5,1) := 1.0;  2  BEGIN  3      LOOP  4          DBMS_OUTPUT.PUT_LINE('i的值为: ' || i);  5          i := i + 0.5; -- 设置步长为0.5  6          EXIT WHEN i > 5.0; -- 当i大于5.0时退出循环  7      END LOOP;  8  END;  9  /
i的值为: 1
i的值为: 1.5
i的值为: 2
i的值为: 2.5
i的值为: 3
i的值为: 3.5
i的值为: 4
i的值为: 4.5
i的值为: 5PL/SQL procedure successfully completed.

3.2.2:使用WHILE LOOP

SYS@orcl> DECLARE i NUMBER(5,1) := 1.0;  2  BEGIN  3      WHILE i <= 5.0 LOOP  4          DBMS_OUTPUT.PUT_LINE('i的值为: ' || i);  5          i := i + 0.5; -- 设置步长为0.5  6      END LOOP;  7  END;  8  /
i的值为: 1
i的值为: 1.5
i的值为: 2
i的值为: 2.5
i的值为: 3
i的值为: 3.5
i的值为: 4
i的值为: 4.5
i的值为: 5PL/SQL procedure successfully completed.

3.3:STEP Clause in FOR LOOP Statement

In this example, the FOR LOOP effectively increments the index by five
这个例子中,展示循环变量n。计数器的步长增量为5。

BEGINFOR i IN 5..15 BY 5 LOOPDBMS_OUTPUT.PUT_LINE (i);END LOOP;
END;

执行并返回结果

SYS@FREE> BEGIN2    FOR i IN 5..15 BY 5 LOOP3      DBMS_OUTPUT.PUT_LINE (i);4    END LOOP;5  END;6  /
5
10
15PL/SQL procedure successfully completed.

3.3:使用LOOP … EXIT WHEN … END LOOP实现带步长的循环

下面是一个使用LOOP … EXIT WHEN … END LOOP结构来实现从1遍历到10,步长为2的示例:

DECLARE  i NUMBER := 1;  
BEGIN  LOOP  DBMS_OUTPUT.PUT_LINE('i的值为: ' || i);  i := i + 2; -- 设置步长为2  EXIT WHEN i > 10; -- 当i大于10时退出循环  END LOOP;  
END;  
/i的值为: 1
i的值为: 3
i的值为: 5
i的值为: 7
i的值为: 9

3.4:使用WHILE LOOP实现带步长的循环

同样,你也可以使用WHILE LOOP来实现相同的功能:

DECLARE  i NUMBER := 1;  
BEGIN  WHILE i <= 10 LOOP  DBMS_OUTPUT.PUT_LINE('i的值为: ' || i);  i := i + 2; -- 设置步长为2  END LOOP;  
END;  
/i的值为: 1
i的值为: 3
i的值为: 5
i的值为: 7
i的值为: 9

4:遍历游标

假设你有一个名为employees的表,包含员工的ID和姓名等信息,你可以使用FOR LOOP遍历这个表的游标。

DECLARECURSOR emp_cur ISSELECT employee_id, first_name, last_name FROM employees;emp_rec emp_cur%ROWTYPE;
BEGINFOR emp_rec IN emp_cur LOOPDBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_rec.employee_id || ', Name: ' || emp_rec.first_name || ' ' || emp_rec.last_name);END LOOP;
END;
/Employee ID: 100, Name: Steven King
Employee ID: 101, Name: Neena Kochhar
Employee ID: 102, Name: Lex De Haan
Employee ID: 103, Name: Alexander Hunold
Employee ID: 104, Name: Bruce Ernst
Employee ID: 105, Name: David Austin
Employee ID: 106, Name: Valli Pataballa
。。。
PL/SQL procedure successfully completed.

在这个例子中,FOR LOOP自动从游标emp_cur中检索每一行,并将每一行的数据存储在emp_rec中,然后你可以在循环体内访问这些数据。

5:注意

  • 在使用DBMS_OUTPUT.PUT_LINE之前,你可能需要在SQL*Plus或SQLcl中设置SERVEROUTPUT ON来确保输出被显示。
  • Oracle PL/SQL的FOR LOOP不直接支持像其他编程语言中那样的条件退出(如break语句),但它通过其结构本身限制了循环的范围,因此通常不需要这种功能。
  • 对于更复杂的循环条件,你可能需要使用WHILE LOOPLOOP...EXIT WHEN...END LOOP结构。

相关文章:

Oracle23ai新特性FOR LOOP循环控制结构增强

在Oracle数据库中&#xff0c;FOR LOOP是一种常用的循环控制结构&#xff0c;它允许你重复执行一系列语句固定次数或直到满足特定条件为止。然而&#xff0c;标准的Oracle PL/SQL中的FOR LOOP主要用于遍历集合&#xff08;如数组或游标的结果集&#xff09;&#xff0c;而不是像…...

DHU OJ 二维数组

思路及代码 #include<iostream> using namespace std; int main(){ //input 多组 //input M,N int 1< <20 //input M 行 N 列 数据 //initialize listint M, N;while (cin >> M >> N){int list[M][N];for (int i 0; i < M-1; i){for (int j 0; j…...

UDP/TCP --- Socket编程

本篇将使用 Linux 中的系统调用来实现模拟 TCP 和 UDP 的通信过程&#xff0c;其中只对 UDP 和 TCP 进行了简单的介绍&#xff0c;本篇主要实现的是代码&#xff0c;至于 UDP 和 TCP 的详细讲解将会在之后的文章中给出。 本篇给出的 tcp 和 udp 的代码中的 echo 都是测试连接是…...

【C语言】最详细的单链表(两遍包会!)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、单链表的概念 1. 单链表的特点 2. 单链表的基本…...

QT:VS2019 CMake编译CEF

CEF介绍 CEF作为一个基于Chromium的开源Web浏览器控件&#xff0c;为第三方应用提供了强大的嵌入浏览器支持。其多平台支持、HTML5特性、自定义能力以及多进程架构等特性&#xff0c;使得CEF在浏览器开发、桌面应用、开发工具以及自动化测试等领域得到了广泛应用。 多平台支持…...

day31(8/19)——静态文件共享、playbook

目录 一、ansible模块 script模块 copy模块 使用command模块下载 nfs-utils rpcbind 在被控制的主机上添加static目录&#xff0c;并创建test文件 command模块 service模块 二、playbook 三、playbook编排vsftpd 1、安装 2、卸载 3、启动服务 4、修改配置文件设置不…...

白骑士的C#教学实战项目篇 4.4 游戏开发

系列目录 上一篇&#xff1a;白骑士的C#教学实战项目篇 4.3 Web开发 在这一部分&#xff0c;我们将探索如何使用 Unity 和 C# 开发游戏。游戏开发结合了编程、图形设计和创意&#xff0c;既充满挑战又充满乐趣。通过这一节的学习&#xff0c;您将了解游戏引擎的基础知识&#…...

在Vue工程中开发页面时,发现页面垂直方向出现两个滚动条的处理

在Vue工程中开发页面时&#xff0c;发现页面垂直方向出现两个滚动条 最近在开发页面时&#xff0c;发现页面多了两个滚动条&#xff0c;如图&#xff1a; 原因&#xff1a; 当一个页面的内容高度大于屏幕的高度时就会出现滚动条。一般情况下当一个页面高度大于屏幕高度时&a…...

【C++初阶】:C++入门篇(一)

文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上&#xff0c;增加了一些面向对象…...

【JAVA CORE_API】Day14 Collection、Iterator、增强for、泛型、List、Set

Collection接口及常用方法 Collection<Object> collection new ArrayList();&#xff1a;实例化ArrayList集合对象&#xff1b; collectionName.add(Object obj);&#xff1a;在集合中增加元素&#xff1b; int sizeName collectionName.size();&#xff1a;获取集合…...

Go更换国内源配置环境变量

背景 要在中国境内下载和使用Go编程语言的包&#xff0c;可以使用国内的Go模块代理来加速下载速度。以下是一些常见的国内Go模块代理源以及如何切换到这些源的方法&#xff1a; 常见国内Go模块代理源 七牛云&#xff08;Qiniu&#xff09; https://goproxy.cn 阿里云&#xff0…...

澎湃认证显实力,浪潮信息存储兼容新篇章

浪潮信息在存储技术兼容性领域取得新突破&#xff0c;其集中式存储HF/AS系列与长擎安全操作系统24强强联合&#xff0c;成功完成澎湃技术认证。此次合作不仅验证了双方产品的无缝对接能力&#xff0c;更体现了浪潮信息在推动全产业链共建共享方面的坚定决心。 浪潮信息澎湃技术…...

Leetcode 3255. Find the Power of K-Size Subarrays II

Leetcode 3255. Find the Power of K-Size Subarrays II 1. 解题思路2. 代码实现 题目链接&#xff1a;3255. Find the Power of K-Size Subarrays II 1. 解题思路 这一题是题目3254的进阶版&#xff0c;其实主要就是增加了算法复杂度。 整体上来说的话思路还是一个分段的思…...

Kotlin学习02-变量、常量、整数、浮点数、操作符、元组、包、导入

变量、常量、整数、浮点数、操作符、元组、包、导入 Book.kt package com.wujialiang.packclass Book {var title: String "Hello" }val PI 3.14; val E 2.178;Main.kt //引入包 //import com.wujialiang.pack.Book; import com.wujialiang.pack.*; //重命名导…...

C++的模板简介

文章目录 一、前言二、函数模板&#xff08;Function Template&#xff09;三、类模板&#xff08;Class Template&#xff09;四、变参模板&#xff08;Variadic Template&#xff09;五、模板的递归与元编程六、模板的局限与陷阱七、常用模板的实例八、C20 的概念&#xff08…...

树莓派5 笔记25:第一次启动与配置树莓派5_8G

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 今日购得了树莓派5_8G版本&#xff0c;性能是同运…...

Melittin 蜂毒肽;GIGAVLKVLT TGLPALISWI KRKRQQ

【Melittin 蜂毒肽 简介】 蜂毒肽&#xff08;Melittin&#xff09;是蜜蜂毒液中的主要活性成分&#xff0c;由26个氨基酸组成&#xff0c;具有强碱性&#xff0c;易溶于水&#xff0c;是已知抗炎性最强的物质之一。蜂毒肽具有多种生物学、药理学和毒理学作用&#xff0c;包括…...

day32

更新源 cd /etc/apt/ sudo cp sources.list sources.list.save 将原镜像备份 sudo vim sources.list 将原镜像修改成阿里源/清华源&#xff0c;如所述 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiver…...

【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南

我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 &#x1f3b5; 许嵩《内线》 ClickHouse 是一款非常高效的开源列式数据库&#xff0c;因…...

按键收集单击,双击和长按

按键收集单击,双击和长按 引言 在我们生活中, 按键是必不可少的, 不同的电器, 有不同的按键, 但是按键总有不够用的时候, 那么给与一个按键赋予不同的功能,就必不可少了. 一个按键可以通过按下的时间长短和频次, 来定义其类型。 一次按键收集&#xff0c; 都是在一个按键收集周…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...