oracle游标
创始人
2025-05-30 21:20:57
0

一、概念

游标的作用是临时存储从数据库中提取的数据块,由系统或者用户以变量的形式定义,是sql的内存工作区;

二、分类

如图,游标主要分为静态游标和动态游标

  • 静态游标:

  • 动态游标:ref cursor属于动态cursor(直到运行时才知道这条查询)

其中:

  • 隐式游标:系统定义和管理的,像DML(insert,delete,update)操作和单行SELECT(select…into…)语句都会被Oracle内部解析为:一个cursor名为SQL的隐式透明游标;另外,一些循环操作中的指针for 循环,都是隐式cursor:例如

BEGINFOR rec IN (SELECT empname, empno FROM tmp)LOOPdbms_output.put_line(rec.empname || '--' || rec.empno);END LOOP;
END;
/
  • 显示游标:用户自己定义的,有明确声明的cursor

三、游标以及游标变量的定义

  • 声明格式

DECLARE
TYPE 游标变量名 IS REF CURSOR;
-- 可以分为强类型和弱类型
TYPE 游标变量名 IS REF CURSOR RETURN 表名%ROWTYPE -- 强类型
TYPE 游标变量名 IS REF CURSOR -- 弱类型

四、游标的生命周期

declare->open->fetch->close
  1. 声明游标:declare

  1. 在DECLARE部分,按照以下格式声明游标:

  1. CURSOR 游标名[参数1 数据类型[,参数2 数据类型]] IS SELECT语句;

  1. 参数是可选部分,如果定义了参数,必须在调用时传入实际的参数,后面的select语句可以是对表、视图等的查询,甚至是联合查询,可以带WHERE 条件、ORDER BY或GROUP BY子句,但不能使用INTO子句,在SELECT 语句中可以使用定义在游标之前定义的变量

DECLARECURSOR id_cur(a number) ISSELECT empno FROM tmp WHERE id = a;
  1. 打开游标:open

  1. 在可执行部分,按照以下格式打开游标:

  1. OPEN 游标名[实际参数1[,实际参数2]];

OPEN id_cur(101);
  1. 提取数据:fetch

  1. 在可执行部分,按照以下格式将游标工作区中的数据取到变量中:

  1. FETCH 游标名 INTO 变量名1[,变量名2]

  1. FETCH 游标名 INTO 记录变量

  1. FETCH语句一次返回一行数据,要返回多行数据,需要使用循环

  1. 定义记录变量的方法如下:

  1. 变量名 表名/游标名%ROWTYPE;eg: v_cur tmp.c1%TYPE;其中tmp为表名,c1为tmp表的字段名

  1. 其中表名必须存在,游标名也必须先定义

  LOOPFETCH id_cur INTO v_cur;EXIT WHEN id_cur%notfound; -- postgre: if not found then exit; end if;dbms_output.put_line(v_cur); -- postgre: raise notice 'result is %',v_cur; END LOOP;
  1. 关闭游标:close

  1. CLOSE 游标名;

  1. 显示游标打开后必须显式关闭。

CLOSE id_cur;

一个完整的例子:

create table tmp(id number(10), empname varchar2(20), empno varchar2(15)); insert into tmp values(100, '销售', 'N001');
insert into tmp values(101, '企划', 'N002');
insert into tmp values(102, '运营', 'N003');
insert into tmp values(103, '开发', 'N004');-- 显示游标
DECLARECURSOR id_cur(a number) ISSELECT empno FROM tmp WHERE id = a;v_cur tmp.empno%TYPE; -- 记录变量
BEGIN// step 1OPEN id_cur(101);LOOPFETCH id_cur INTO v_cur;EXIT WHEN id_cur%notfound; -- postgre: if not found then exit; end if;dbms_output.put_line(v_cur); -- postgre: raise notice 'result is %',v_cur; END LOOP;CLOSE id_cur;// step 2OPEN id_cur(102);LOOPFETCH id_cur INTO v_cur;EXIT WHEN id_cur%notfound; -- postgre: if not found then exit; end if;dbms_output.put_line(v_cur); -- postgre: raise notice 'result is %',v_cur; END LOOP;CLOSE id_cur;
END;
/-- 隐式游标
DECLARE
rec record; -- 记录数据类型
BEGINFOR rec IN (SELECT empname, empno FROM tmp)LOOPdbms_output.put_line(rec.empname || '--' || rec.empno);END LOOP;
END;
/

五、游标特点

游标是可以被多次open进行使用的

显式cursor是静态cursor,作用域是全局的

静态cursor也只有pl/sql代码才可以使用

PL/SQL cursor 按定义是静态的

ref cursor 正好相反,可以动态地打开,或者利用一组SQL静态语句来打开

六、游标属性

-- 游标%属性        返回值类型            意义
%ROWCOUNT            整型          获得FETCH语句返回的数据行数;
%FOUND               布尔型        最近的fetch返回一行数据则为真,否则为假;
%notfound            布尔型        与%found属性相反
%isopen              布尔型        游标打开则为真,否则为假

相关内容

热门资讯

国医战士:我的觉醒之路与薪火守... 一、根脉:红土地上的传承之子 1974年,李铭豪出生在广东吴川一个淳朴的农家。这片南海之滨的红土地,...
库克预告:苹果今年有前所未见的... 1月31日消息,苹果日前交上了一份历史最强季度财报,多项核心财务指标创历史新高,iPhone业务成为...
原创 白... 一夜之间,全崩了 昨天白天的时候,看到白银和黄金在大跌,想想昨夜跌跌就差不多了,结果一觉醒来完全颠覆...
夜“血洗”!白银,史诗级暴跌!... 北京时间1月31日凌晨,现货白银价格一度暴跌36%,创出历史最大日内跌幅;现货黄金价格一度下跌超过1...
一老人家中发生火灾,近40万元... 前不久,自贡赵女士爷爷家发生了火灾。因为爷爷奶奶不喜欢把钱存银行,家里近40万现金被烧毁大半。赵女士...
史诗级暴跌!白银一度重挫18% 1月30日,此前连续暴涨的贵金属,集体踩下“急刹”,其中白银等品种更迎来史诗级暴跌。 国际市场上现货...
视频|黄金白银“瀑布流直线跳水... 1月29日至1月30日,黄金白银遭遇“瀑布流直线跳水”,现货黄金从猛冲5600美元/盎司,到跌穿50...
今天凌晨,黄金、白银、美股,全... 北京时间1月31日凌晨,恐慌性抛售席卷全球贵金属市场。 现货白银日内跌幅一度扩大至34.67%,从1...
OpenAI详解AI代理如何应... AIPress.com.cn报道 1月31日消息,OpenAI 在一篇官方博客中介绍了其 AI 代理...
21亿减值离场,分众掀开了网贷... 作为广告行业巨头的分众传媒,近期的几则公告却意外挑开了网贷行业正面临的艰难现状。 分众传媒近日发布的...
披露换手率、新增中长期业绩!公... 1月30日,中国证监会就《公开募集证券投资基金信息披露内容与格式准则第2号——定期报告的内容与格式》...
40年最大单日跌幅!现货黄金价... 美国总统特朗普提名凯文·沃什(Kevin Warsh)出任美联储主席,引爆市场鹰派预期,贵金属遭恐慌...
一纸提名引爆史诗级抛售:现货白... 1月31日,周五(1月30日)纽约时段,国际贵金属价格大幅跳水,其中现货白银一度跌超36%,黄金最高...
股票行情快报:工商银行(601... 证券之星消息,截至2026年1月28日收盘,工商银行(601398)报收于7.2元,下跌0.41%,...
002514、300087,被... 两家公司被证监会立案调查。 1月30日,宝馨科技(002514.SZ)公告称,公司及公司实际控制人马...
中山东方医院标准化就诊流程:从... 在医疗服务质量不断提升的今天,标准化就诊流程建设已成为医院提升服务效率、改善患者体验的重要抓手。医院...
彩票卖不动了?去年全国彩票收入... 中国彩票收入增速持续放缓。 1月30日,财政部公布2025年12月份全国彩票销售情况。2025年全年...
原创 超... 当消费者为家中购置新物品时,功能之外,产品在“家”中的融入感、协调性如何,正成为越来越重要的考量——...
寒武纪预计2025年至高盈利2... 《科创板日报》1月30日讯(记者 郭辉)寒武纪发布2025年年度业绩预告。 公告显示,寒武纪预计20...
2025年我国基本医保统筹基金... 2025年我国基本医保统筹基金收入约2.95万亿元 新华社北京1月30日电(记者彭韵佳)记者1月3...