Oracle 游标的使用——游标cursor 和 游标sys_refcursor 的使用

本文详细介绍了Oracle数据库中的游标概念,包括静态游标的显式和隐式用法,以及动态游标的自定义类型REF CURSOR和系统类型SYS_REFCURSOR的应用。通过对各种游标类型的实例讲解,帮助读者理解游标的使用和区别。

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

Oracle 游标的使用——游标cursor 和 游标sys_refcursor 的使用

游标知识点


游标分为静态游标和动态游标两大类。


1、静态游标:显式游标和隐式游标称为静态游标,因为在使用他们之前,游标的定义已经完成,不能再更改。
(1)显式游标:用于处理SELECT语句返回的多行数据;人为创建,干预。举例:CURSOR
(2)隐式游标:用于处理SELECT INTO和非查询的DML语句;系统自动创建,管理。


2、动态游标:游标在声明时没有设定,在打开时可以对其进行修改。分为强类型游标和弱类型游标。
(1)强类型动态游标:在声明变量时使用return关键字定义游标的返回类型。举例:REF CURSOR RETURN
(2)弱类型动态游标:在声明变量时不使用return关键字定义游标的返回类型。举例:REF CURSOR、SYS_REFCURSOR
一般动态游标有 REF CURSOR、REF CURSOR RETURN、SYS_REFCURSOR。其中,REF CURSOR RETURN 为强类型,REF CURSOR 为弱类型、SYS_REFCURSOR 为系统预定义(在STANDARD包中定义的)弱类型。

(一)静态游标

1、显式游标:CURSOR 的使用

declare
  CURSOR cur_emp IS select * from scott.emp;
  row_emp scott.emp%rowtype;
begin
  open cur_emp; --开启游标  
  loop
    fetch cur_emp into row_emp; -- fetch into 获取游标的值
    exit when cur_emp%notfound; -- 如果没有获取到值,则退出循环
    dbms_output.put_line(row_emp.empno || ' ' || row_emp.ename); --输出   
  end loop;
  close cur_emp; --关闭游标  
end;

2、隐式游标

可参考文章:Oracle 游标详解(cursor)

知识点:
静态游标分为两种:隐式游标和显式游标。

(二)动态游标

1、自定义类型:REF CURSOR 的使用

declare
  TYPE refcursor IS REF CURSOR RETURN scott.emp%rowtype; -- 定义游标
  cur_emp refcursor;
  row_emp scott.emp%rowtype;
begin
  open cur_emp for select * from scott.emp;
  loop
    fetch cur_emp into row_emp; -- fetch into 获取游标的值
    exit when cur_emp%notfound; -- 如果没有获取到值,则退出循环
    dbms_output.put_line(row_emp.empno || ' ' || row_emp.ename); --输出 
  end loop;
  close cur_emp;
end;

动态游标知识点:

1、动态游标的格式:

TYPE 游标类型 IS REF CURSOR;  --定义一个动态游标
游标名  游标类型;

2、动态游标的两种类型:
(1)强类型动态游标:在声明变量时使用return关键字定义游标的返回类型。
示例:TYPE refcursor IS REF CURSOR RETURN scott.emp%rowtype; – 定义游标
(2)弱类型动态游标:在声明变量时不使用return关键字定义游标的返回类型。
示例:TYPE refcursor IS REF CURSOR; – 定义游标

2、系统类型:SYS_REFCURSOR 的使用(属于动态游标中的弱类型动态游标)

使用oracle9i提供的SYS_REFCURSOR弱类型游标,定义游标都省了

declare
  cur_emp SYS_REFCURSOR;
  row_emp scott.emp%rowtype;
begin
  open cur_emp for select * from scott.emp;
  loop
    fetch cur_emp into row_emp; -- fetch into 获取游标的值
    exit when cur_emp%notfound; -- 如果没有获取到值,则退出循环
    dbms_output.put_line(row_emp.empno || ' ' || row_emp.ename); --输出 
  end loop;
  close cur_emp;
end;

参考资料

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值