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              布尔型        游标打开则为真,否则为假

相关内容

热门资讯

期货市场沉淀资金创7783亿历... 近期期货市场资金流入呈现加速态势,沉淀资金总量达到近7783亿元的历史新高。这一数据自6月25日以来...
价格法修正草案公布,强调“反内... 政策面再出“反内卷”利好,7月24日,《中华人民共和国价格法修正草案》公开征求意见:明确不正当价格行...
原创 特... 关税风暴:特朗普贸易战的全球冲击波 8月1日,一场由美国总统特朗普发起的全球贸易战即将进入高潮。看似...
2024消费品上市公司研究报告... 《2024消费品上市公司研究报告》 (内容出品方:和君咨询x新华网) 报告共计:40页 本研报通过对...
特斯拉Q2营收下滑12%,马斯... 特斯拉于7月24日公布了2025年第二季度财报,数据显示总营收降至225.0亿美元,同比下滑12%;...
衣食住行跟我逛|“今年更甜!”... 盛夏时节,誉称为“紫水晶”的黑葡萄迎来最佳赏味期。近日,扬子晚报/紫牛新闻记者走访苏州市场发现,多数...
棕榈油与油菜籽:印尼库存降,马... 【印尼5月末棕榈油库存下滑,马棕7月上旬增产,加菜籽预估调整】印尼棕榈油协会数据显示,因出口激增,印...
康佳易主华润 半导体业务整合成... 康佳集团股份有限公司是深圳首家营业收入超百亿元的工业企业。 来源:康佳集团 靴子落地。在长达三个多月...
英特尔营收超预期,宣布裁员,C... 英特尔数据中心+AI收入超预期难掩盈利困境,英特尔CEO未能证明公司将扭亏为盈,股价应声下跌。 周四...
我国新药好药呈现快速增长态势:... 央视网消息:国家药监局最新统计显示,我国上半年批准创新药43个,同比增长59%,接近2024年批准创...
赛峰集团宣布完成对柯林斯宇航飞... 赛峰集团宣布完成对柯林斯宇航(Collins Aerospace)飞行控制与作动业务的收购。该业务为...
中国最大农业互联网公司即将登录... 来源:ACN亚太商讯 近日,中国领先的农产品B2B数字化服务公司一亩田集团向美国证券交易委员会(SE...
常熟银行股价微跌0.54% 拟... 截至2025年7月24日收盘,常熟银行股价报7.37元,较前一交易日下跌0.54%,成交额3.16亿...
股市必读:湖南黄金(00215... 截至2025年7月24日收盘,湖南黄金(002155)报收于18.58元,上涨0.27%,换手率2....
股票行情快报:浙江众成(002... 证券之星消息,截至2025年7月24日收盘,浙江众成(002522)报收于5.07元,上涨1.0%,...
“反内卷”与利率上涨 冉学东 反内卷政策持续推进,金融市场反应明显,首先就是大宗商品的牛市。 大宗商品期货市场近期出现强劲...
24日不锈钢下跌0.08%,最... 来源:新浪期货 新浪期货 根据交易所数据,截至7月24日收盘主力合约不锈钢2509,涨跌-0.08%...
稀有金属ETF(159608)... 中证网讯 7月24日,稀有金属概念股午后拉升,锂矿、稀土永磁板块走强,相关ETF领涨。截至收盘,稀有...
北交所上市公司生物谷大宗交易折... 每经讯,2025年7月24日,北交所上市公司生物谷(833266,收盘价:11.7元)发生一笔大宗交...
瑞信证券更名,北京证券重出江湖... (图片来源:视觉中国) 蓝鲸新闻7月24日讯(记者 王婉莹)从外资券商转身为国资控股券商后,瑞信证券...