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. 或

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

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...