广告
返回顶部
首页 > 资讯 > 数据库 >REF CURSOR 总结
  • 280
分享到

REF CURSOR 总结

2024-04-02 19:04:59 280人浏览 安东尼
摘要

REF 游标:REF游标又称为动态游标,在运行时使不同的语句与之关联,动态关联结果集的临时对象,即在运行的时候动态决定执行查询。REF游标可以使用游标变量。游标变量:游标变量是一种引用REF游标类型的变量,

REF 游标:
REF游标又称为动态游标,在运行时使不同的语句与之关联,动态关联结果集的临时对象,即在运行的时候动态决定执行查询。REF游标可以使用游标变量。
游标变量:
游标变量是一种引用REF游标类型的变量,只想动态关联的结果集。
游标变量的类型:
1.具有约束的游标变量,具有返回类型的游标变量也称为强游标。
2.无约束的游标变量,没有返回类型的游标变量也称为弱游标。
REF游标的作用:
实现程序间传递结果集的功能,利用REF cursor 也可以实现bulk sql 从而提高sql性能。
静态游标和REF游标的区别:
1.静态游标是静态定义,REF游标是动态关联
2.使用REF游标需要REF游标变量
3.REF游标可以作为参数进行传递,而静态游标是不能作为参数传递的。
REF游标的语法:
1.强类型REF游标:指定return datatype,REF游标变量的类型必须和return datatype一致。
语法:TYPE TYPE_NAME IS REF CURSOR RETURN DATATYPE;
2.弱类型REF游标:不指定return datatype 能和任何类型的cursor 变量匹配,用于获取任何结果集。
语法:TYPE TYPE_NAME IS REF CURSOR;
SYS_REFCURSOR:
主要用在过程中返回结果集,如果仅仅为了返回值,无需自己在包头中定义游标类型,只需直接使用sys_refcursor 即可轻松返回结果。
提示:
使用静态光标--通过静态SQL(但不用ref光标)--比使用ref光标效率高,而ref光标的使用仅限于以下几种情况:
把结果集返回给客户端;
在多个子例程之间共享光标(实际上与上面提到的一点非常类似);
没有其他有效的方法来达到你的目标时,则使用ref光标,正如必须用动态SQL时那样;
简言之,首先考虑使用静态SQL,只有绝对必须使用ref光标时才使用ref光标,也有人建议尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。
PACKAGE
示例中涉及到包(package)和包体(package body)以下为package 用法的说明:
包结构:
一个包由两个分开的部分组成:包规范和包体
1.包定义(package):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。
语法:
CREATE [OR REPLACE] PACKAGE PACKAGE_NAME
{IS|AS}
[公有数据类型定义]
[公有游标声明]
[公有变量、常量声明]
[公有子程序声明]
END [PACKAGE_NAME];
2.包主体(package body):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。如果在包主体中的游标或子程序并没有在包头中定义,那么这个游标或子程序是私有的。
语法:
CREATE [OR REPLACE] PACKAGE BODY PACKAGE_NAME
{IS |AS}
[私有数据类型定义]
[私有变量、常量]
[私有子程序声明和定义]
[公有子程序定义]
BEGIN
执行部分(初始化部分);
END [PACKAGE_NAME];
与类相同,包中的程序元素也分为公有元素和私有元素两种,这两种元素的区别是他们允许访问程序范围不同,即他们的作用域不同。公有元素不仅可以被包中的函数、过程所调用也可以被包外的PL/SQL程序访问,而私有元素只能被包内的函数和过程所访问。包定义和包主体分开编译,并作为两部分分开的对象存放在数据库字典中。包定义一定要在包主体前面编译,包主体可以没有,但是包定义一定要有,包的名称和包体的名称要保持一致。

示例1:强类型REF游标

DECLARE
TYPE REF_CURSOR IS REF CURSOR RETURN DJ_DJB%ROWTYPE;
------游标仅能打开DJ_DJB表的数据

REF_C REF_CURSOR;
----游标变量

V_DJB DJ_DJB%ROWTYPE;
SELECTioN VARCHAR2(1):=('&请输入:');
BEGIN
  IF SELECTION='1' THEN
    OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2016%' AND ROWNUM<10;
    ELSIF SELECTION='2' THEN
    OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2017%' AND ROWNUM<10;
    END IF;
    LOOP
      FETCH REF_C INTO V_DJB;
      EXIT WHEN REF_C%NOTFOUND;
      DBMS_OUTPUT.ENABLE(BUFFER_SIZE=>NULL);
      DBMS_OUTPUT.PUT_LINE(V_DJB.SLBH||','||V_DJB.BDCZH);
      END LOOP;
      CLOSE REF_C;
      END;

示例2:弱类型REF游标

DECLARE
TYPE REF_CURSOR IS REF CURSOR;
REF_C REF_CURSOR;

V_V1 VARCHAR2(100);

SELECTION VARCHAR2(1):=('&请输入:');

BEGIN
  IF SELECTION='1' THEN
    OPEN REF_C FOR SELECT TO_CHAR(BDCZH) FROM DJ_DJB WHERE SLBH LIKE '2016%' AND ROWNUM<10;
        -------弱类型游标对目标表没有限制,数据可以使来自任何表

    ELSIF SELECTION='2' THEN
    OPEN REF_C FOR SELECT TO_CHAR(QLRMC) FROM DJ_QLRGL WHERE SLBH LIKE '2017%' AND ROWNUM<10 AND QLRLX='权利人';
            -------弱类型游标对目标表没有限制,数据可以使来自任何表
    END IF;

    LOOP
      FETCH REF_C INTO V_V1;
      EXIT WHEN REF_C%NOTFOUND;
      DBMS_OUTPUT.ENABLE(BUFFER_SIZE=>NULL);
      DBMS_OUTPUT.PUT_LINE('输出结果值:'||V_V1);
      END LOOP;
      CLOSE REF_C;
      END;

示例3:SYS_REFCURSOR

DECLARE

V_DJB DJ_DJB%ROWTYPE;

REF_C SYS_REFCURSOR; ---利用SYS_REFCUSOR 来声明游标变量

SELECTION VARCHAR2(1):=('&请输入:');
BEGIN
  IF SELECTION='1' THEN
    OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2016%' AND ROWNUM<10;
    ELSIF SELECTION='2' THEN
    OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2017%' AND ROWNUM<11;
    END IF;

 LOOP
   FETCH REF_C INTO V_DJB;
   EXIT WHEN REF_C%NOTFOUND;
   DBMS_OUTPUT.ENABLE(BUFFER_SIZE=>NULL);
   DBMS_OUTPUT.PUT_LINE(V_DJB.SLBH||','||V_DJB.BDCZH);
   END LOOP;
   CLOSE REF_C;
   END;

示例4:REF 游标作为参数传递

CREATE OR REPLACE PACKAGE EMP_T
IS
TYPE REF_CURSOR IS REF CURSOR RETURN DJ_DJB%ROWTYPE;
PROCEDURE GET_BDCZH(REF_C IN OUT REF_CURSOR,SELECTION VARCHAR2);
PROCEDURE RETURN_C(SELECTION VARCHAR2);

END;

CREATE OR REPLACE PACKAGE BODY EMP_T 
IS
PROCEDURE GET_BDCZH (REF_C IN OUT REF_CURSOR,SELECTION VARCHAR2)
  IS
  BEGIN
    IF SELECTION =1 THEN
      OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2016%' AND ROWNUM<10;
      ELSIF SELECTION=2 THEN
      OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2017%' AND ROWNUM<10;
      END IF;
      END;

PROCEDURE RETURN_C (SELECTION VARCHAR2)
  IS
  V_1 REF_CURSOR;
  V_DJB dj_djb%ROWTYPE;

  BEGIN
    GET_BDCZH(V_1,SELECTION);
    LOOP
      FETCH V_1 INTO V_DJB;
      EXIT WHEN V_1%NOTFOUND;
      DBMS_OUTPUT.ENABLE(BUFFER_SIZE=>NULL);
      DBMS_OUTPUT.PUT_LINE(V_DJB.SLBH||','||V_DJB.BDCZH);
      END LOOP;
      CLOSE V_1;
      END;
      END;
---调用
begin
  EMP_T.RETURN_C(1);
  END;

示例5:使用BULK COLLECT INTO.......批量提取数据

DECLARE
TYPE REF_CURSOR IS REF CURSOR;
REF_C REF_CURSOR;

TYPE R_DJB IS TABLE OF DJ_DJB%ROWTYPE INDEX BY BINARY_INTEGER;
V_DJB R_DJB;
SELECTION VARCHAR2(1):=('&请输入:');

BEGIN
  IF SELECTION='1' THEN
  OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2016%' AND ROWNUM<100;
  ELSIF SELECTION='2' THEN
  OPEN REF_C FOR SELECT * FROM DJ_DJB WHERE SLBH LIKE '2017%' AND ROWNUM<100;
  END IF;
  LOOP
    FETCH REF_C BULK COLLECT INTO V_DJB LIMIT 10;
    ---EXIT WHEN REF_C%NOTFOUND;
     DBMS_OUTPUT.ENABLE(BUFFER_SIZE=>NULL);
    ---FOR I IN 1..V_DJB.COUNT LOOP
    FOR I IN V_DJB.FIRST..V_DJB.LAST LOOP
      DBMS_OUTPUT.PUT_LINE(V_DJB(I).SLBH||','||V_DJB(I).BDCZH||'I 的值为:'||I);
      END LOOP;
      DBMS_OUTPUT.PUT_LINE('ROWCOUNT的值:'||REF_C%ROWCOUNT);
      EXIT WHEN REF_C%NOTFOUND;
      END LOOP;
      END;

BY WOLIAHaiTO 2018.04.03

您可能感兴趣的文档:

--结束END--

本文标题: REF CURSOR 总结

本文链接: https://www.lsjlt.com/news/44752.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • REF CURSOR 总结
    REF 游标:REF游标又称为动态游标,在运行时使不同的语句与之关联,动态关联结果集的临时对象,即在运行的时候动态决定执行查询。REF游标可以使用游标变量。游标变量:游标变量是一种引用REF游标类型的变量,...
    99+
    2022-10-18
  • oracle cursor 用法总结
    PL sql中cursor用法是非常广泛的,常常用于存储过程和函数的返回值,其中用于函数的返回值变相的解决了pl sql 没有表值函数的问题,一般的,在java 调用...
    99+
    2022-10-18
  • ORACLE SYS_REFCURSOR VS REF CURSOR
    CURSOR是强类型,SYS_REFCURSOR 是弱类型(类似C#的var)。 Cursor: create or replace package pkg as cursor cur is select...
    99+
    2020-10-24
    ORACLE SYS_REFCURSOR VS REF CURSOR
  • 2011-10-19 对REF CURSOR 的理解
    http://www.itpub.net/thread-1499223-7-1.html 64楼   我创建了这张表并填入了数据: CREATE TABLE plch_emp...
    99+
    2022-10-18
  • Vue中ref、reactive、toRef、toRefs、$refs的基本用法总结
    目录一、ref reactive1.1.为什么需要ref、reactive 1.2.ref reactive基本使用二、toRef、toRefs 三、$r...
    99+
    2022-11-13
    vue ref reactive toRef toRefs $refs vue ref reactive vue中refs用法和作用
  • ORA-19206: Invalid value for query or REF CURSOR parameter ORACLE 报错 故障修复 远程处理
    文档解释 ORA-19206: Invalid value for query or REF CURSOR parameter Cause: The queryString argument passed to DBMS_XMLGEN.ne...
    99+
    2023-11-05
    报错 故障 Invalid
  • ORA-06595: REF CURSOR parameters are not supported in forwarded RPC calls ORACLE 报错 故障修复 远程处理
    文档解释 ORA-06595: REF CURSOR parameters are not supported in forwarded RPC calls Cause: An attempt was made to make a forw...
    99+
    2023-11-04
    报错 故障 CURSOR
  • 【Pandas总结】第五节 Pandas 数据查询方法总结_df.loc()总结
    文章目录 一、写在前面二、查询方法:`df.loc()`2.1 查询单个值2.2 查询列表对应的值2.3 查询区间内的结果2.4 条件查询2.5 按照函数要求查询 三、写在最后 ...
    99+
    2023-09-26
    pandas python 数据分析
  • MyBatisPlus总结
    目录 MyBatisPlus MP特点 MP框架结构 MP使用准备 导入依赖 springboot整合mybatisplus配置文件 定义好实体类User后编辑mapper接口 @Mapper与@MapperScan("包名")区别 MP基...
    99+
    2023-10-18
    java mysql spring
  • 总结--3
    主线程创建的时候会默认创建Looper、HandlerThread则是内置Looper,除此之外其他的线程创建时是不会创建Looper的,需手动创健线程自己的Looper。子线程更新主线程创建的控件引发的错误:Only the origin...
    99+
    2023-01-31
  • python:yield总结
    资源总结来源于以下各地:1.http://blog.donews.com/limodou/archive/2006/09/04/1028747.aspx2.http://blog.chinaunix.net/uid-26922865-id-...
    99+
    2023-01-31
    python yield
  • python 总结
    一.列表 1.extend(列表独有功能) 循环添加到一个列表中 a.有列表users = ['张三',‘李四]   people = ['小明,王五'] users.extend(people)   # 在users中添加 p...
    99+
    2023-01-31
    python
  • SSTI---总结
     Laravel Blade是Laravel提供的一个既简单又强大的模板引擎 和其他流行的PHP模板引擎不一样,Blade并不限制你在视图view中使用原生的PHP代码 所有的Blade视图页面都将被编译成原生的PHP代码并缓存起来,除...
    99+
    2023-09-21
    安全
  • oracle总结
    创建表空间create tablespance 表名datafile ‘’;-- 放在的位置size --设置大小autoextend onnext ; --扩展大小 -- 2删除表空间drop tablespance 表名;...
    99+
    2014-09-13
    oracle总结
  • CSS3总结
      一、选择器 1.通用选择器 E~F:E后边所有和E同级的F 2.属性选择器 E[att^=’val’]:att属性中以val开头的 E[att$=’val’]:以val结尾的 E[att*=’val’]含有val的选择器 3.伪类选...
    99+
    2023-01-31
  • 【JAVA】CAS总结
    什么是CAS CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的...
    99+
    2023-09-24
    java jvm 开发语言
  • Android TabLayout总结
    文章目录 Android TabLayout总结基本使用添加图标、隐藏下划线自定义下划线、添加分割线设置角标圆角样式自定义View+Lottile代码下载 Android TabLay...
    99+
    2023-09-04
    android TabLayout
  • Handler_read_*的总结
    优化SQL,只懂执行计划?不行滴! 在分析一个SQL的性能好坏时,除了执行计划,另外一个常看的指标是"Handler_read_*"相关变量。 Handler_read_key Handler_read...
    99+
    2021-03-16
    Handler_read_*的总结
  • Mysql锁总结
    数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来 实现这些访问规则的重要数据结构 根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类 全局锁...
    99+
    2014-11-05
    Mysql锁总结
  • Oracle锁总结
    《oracle的锁》在数据库中必须要了解的几点:1、事务是数据库的核心,他们是好东西2、应该延迟到适当的时刻才提交。不要太快提交,以避免对系统带来压力,这是因为,即使事务很长或很大,也一般不会对系统造成压力...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作