Oracle数据库存储过程中cursor游标、loop循环以及for循环的用法(一篇文章讲清Oracle数据库存储过程如何使用)

Oracle数据库存储过程中cursor游标、loop循环以及for循环的用法

在Oracle存储过程中,游标(Cursor)、loop循环和for循环是常用的控制结构。下面分别介绍它们的用法:

一、游标(Cursor)

游标用于从数据库中检索数据,并且可以多次读取同一查询结果集。使用游标时,通常需要四个步骤:声明游标、打开游标、提取数据和关闭游标。

1.1 声明游标

复制代码
   declare
cursor cursor_name is select column1, column2 from table_name;
   end;
   / 

1.2 打开游标

复制代码
   begin
open cursor_name;
   end;
   / 

1.3 提取数据

复制代码
   begin
loop
fetch cursor_name into variable1, variable2;
exit when cursor_name%notfound;
-- 处理每行数据
end loop;
   end;
   / 

1.4 关闭游标

复制代码
   begin
close cursor_name;
   end;
   /

1.5 举个具体例子:
1.5.1 创建存储过程

复制代码
create or replace procedure test_select3_procedure
(sex  varchar)
AS
--游标的定义
Cursor test_cursor is
select id,ly_mc,LY_NB,ly_nl from ly_ds where LY_NB=sex;
cur test_cursor%rowtype;  --游标的类型,我理解类似于list的泛型
BEGIN
for cur in test_cursor loop
exit when test_cursor%notfound;
dbms_output.put_line('数据是:'||cur.id||'_'||cur.ly_mc||'_'||cur.LY_NB||'_'||cur.ly_nl);
end loop;
END;

1.5.2 执行存储过程

复制代码
set serveroutput on;
execute test_select3_procedure('女');

1.5.3 会得到如下的遍历结果,正是我根据条件女查询到的结果集

复制代码
PROCEDURE TEST_SELECT3_PROCEDURE 已编译
匿名块已完成
数据是:2_王五_女_22
数据是:3_赵六六_女_29
数据是:4_李四_女_20

以上代码展示了如何使用游标来处理查询结果集。

二、LOOP循环

Loop循环用于执行重复的代码块,直到满足某个条件。它适用于无限循环,可以通过EXIT WHEN语句退出循环

复制代码
   begin
loop
-- 循环体
exit when condition;
end loop;
   end;
   / 

2.1举个loop具体例子:

复制代码
【示例】打印数字1-10
--打印数字1-10
declare
  --声明循环变量并赋初始值
  v_num number  :=1;
begin
 loop
   --退出循环的条件
   exit when v_num >10;
   dbms_output.put_line(v_num);
   --循环变量自增
   v_num :=v_num+1;
 end loop;
end;

执行结果:
1
2
3
4
5
6
7
8
9
10

三、For 循环

For循环用于执行固定次数的迭代,适用于已知循环次数的情况

复制代码
   begin
for i in range起步..范围结束 loop
-- 循环体
end loop;
   end;
   / 

3.1 举个for循环的具体例子:

复制代码
-- 循环累加
declare
  var_sum number := 0;
begin
  for i in 1 .. 100 loop
    var_sum := var_sum + i;
  end loop;
  sys.dbms_output.put_line(var_sum); -- 5050
end;

综上所述,Oracle存储过程中的游标、loop循环和for循环各有其适用场景,游标适合处理查询结果集,loop循环适合无限循环 ,而for循环适合固定次数的迭代。这些控制结构在处理数据库操作时非常有用,能够提高程序的效率和灵活性。

相关推荐
不恋水的雨13 分钟前
数据库char字段做trim之后查询很慢的解决方式
数据库·sql
眠りたいです2 小时前
MySQL基础与常用数据类型浅析
linux·数据库·mysql
唐可盐3 小时前
Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
数据库·mysql·oracle
阑梦清川3 小时前
C#建立与数据库连接(版本问题的解决方案)踩坑总结
开发语言·数据库·c#
自由鬼3 小时前
Vitess 深度解析:一个云原生 MySQL 数据库扩展系统
数据库·mysql·云原生
码明4 小时前
4.查看、删除数据库
数据库·oracle
mit6.8244 小时前
[Data Pipeline] MinIO存储(数据湖) | 数据层 Bronze/Silver/Gold
数据库·python
TDengine (老段)4 小时前
TDengine 集群超能力:超越 InfluxDB 的水平扩展与开源优势
大数据·数据库·开源·时序数据库·iot·tdengine·涛思数据
刘俊辉个人博客6 小时前
端口安全配置示例
运维·网络·数据库·计算机网络·安全·网络安全
lyh13446 小时前
Zapier构建工作流自动化
数据库·oracle·自动化