当前位置:  数据库>oracle

Oracle显示游标的使用详解

    来源: 互联网  发布时间:2017-05-15

    本文导语: Oracle显示游标就是在声明单元明确定义的SELECT子句,并同时指定一个名字通过这个名字规范化地引用游标属性,同时在OPEN,FETCH,CLOSE语句中通过名字来引用显示游标INSERT,UPDATE,DELETE或者MERGE都没有显示游标这一说            ㈠ ...

Oracle显示游标就是在声明单元明确定义的SELECT子句,并同时指定一个名字
通过这个名字规范化地引用游标属性,同时在OPEN,FETCH,CLOSE语句中通过名字来引用显示游标
INSERT,UPDATE,DELETE或者MERGE都没有显示游标这一说     

      ㈠ 声明显示游标

      语法:
      CURSOR cursor_name [ ( [parameter [,parameter...] ) ]  [RETURN return_specification]
      IS
        SELECT_statement
      这里Think建议,大家把游标放在包中定义
      这是一处声明,到处使用的方式
      以后要改善维护这个查询也就变得更加容易,而且能最小化查询语句的解析次数,同样可从性能上获益
      不过千万注意,在包级别定义,游标的生命是持续于整个会话范围
      这也意味着一个包级别的游标会一直保持打开状态,除非我们显示关闭该游标或者杀掉session
      下面对可选部分的参数列表和RETURN作详尽说明
     
      ⑴ 为什么要使用RETURN这个语句呢?
      首先,使用RETURN语句,实际上相当于公开声明了每次FETCH操作会返回的数据结构
      也就是,游标返回什么样的记录,返回的顺序是什么,都包含了哪些列等这些信息都已大白天下
      这就带来一个巧妙的地方,即我们可以把游标头和游标体分隔开来,比如:
      PACKAGE emp_info
      IS
        CURSOR emp_cur (name_in IN emp.name%TYPE) RETURN emp%ROWTYPE;
      END;
     
      PACKAGE BODY emp_info
      IS
        CURSOR emp_cur (name_in IN emp.name%TYPE) RETURN emp%ROWTYPE
        IS
          SELECT * FROM EMP WHERE name LIKE name_in;
      END;
      显然,包体的游标实际上是个黑盒子
      这带来两点好处:
      --隐藏信息,包体如何实现就可以变得非常神秘
      --最小化重编译,我们可以按需求的变化修改包体内游标的实现而不会影响到包头的游标规范
        这也意味着所有依赖于这个包的程序都不会被置成无效状态,自然也无须重编译
      游标的RETURN语句,可以由下面任意一种数据类型组成:
      ▲ table_name%ROWTYPE:基于某个数据库表定义的记录类型
      ▲ cursor_name%ROWTYPE:基于某个已经定义好的游标定义的记录类型
      ▲ record_type%ROWTYPE:基于程序员自定义的记录类型
      这里还有一个需要注意的是,SELECT 列表和RETURN的返回记录,他俩:
      --列的数量要相匹配
      --记录的数据类型也须要相互匹配
     
      ⑵ 啥时需要把我们的游标参数化呢?
      如果我们要在多个地方使用一个游标,每次只是WHERE子句的值不同,我就可以创建一个带参的游标,比如:
      DECLARE
        CURSOR cursor_name (par_in IN VARCHAR2)
        IS
          SELECT emp_id,emp_name FROM emps
            WHERE emp_name=UPPER(par_in);
      游标中最常见的会使用参数的地方就是WHERE子句,不过也可以在SELECT语句中的任何地方使用参数,比如:
      DECLARE
        CURSOR cursor_name (par_in IN VARCHAR2)
        IS
          SELECT emp_name,par_in,job FROM emps
            WHERE emp_name=UPPER(par_in);
      游标参数的作用范围受限于游标,我们无法在游标关联的SELECT语句之外引用游标参数,如,执行单元处引用则无法编译通过
      游标参数只能是一个IN型参数,游标是不能通过参数列表把值传出去的
      游标参数化大抵有两个好处:
      ① 避免WHERE过滤条件是硬编码,让游标更好的重用
      ② 避免游标作用范围的问题,我们可在外层块定义游标,然后在内层块用局部变量调用这个游标
     
      ㈡ 打开显示游标
     
      语法:
      OPEN cursor_name [ ( parameter [,parameter...] ) ];
      Think认为,这里最重要的是关注Oracle的读一致性
      当我们打开一个游标时,PL/SQL会执行这个游标的查询语句,并标识出活跃数据集--符合WHERE过滤的记录
      但是OPEN不会真正提取出任何一行数据,这个动作是由FETCH来完成
      然而,无论我们什么时候开始第一次FETCH数据,Oracle都会保证所有的FETCH反映的都是游标打开那一刻的数据状态
      也就是,从打开游标的那一刻直到游标关闭的那一刻,通过游标获取的数据会自动忽略掉游标打开以后
      其他活动会话所进行的插入、更新、删除等操作
      如果我们使用FOR UPDATE子句,所有的活跃数据集在游标打开那时刻都会被锁定
      这就是Oracle的读一致性
      Oracle利用SCN来实现这个理论,开始查询时,会确定一个SELECT SCN,这样就保证了事务槽里所有的SCN都小于SELECT SCN


    
 
 

您可能感兴趣的文章:

  • oracle的最大游标数问题
  • Oracle事务!使用游标提交过程
  • Oracle 数据 使用游标
  • 关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded)
  • jsp访问oracle超出打开游标的最大数是什么原因?急,在线给分。
  • 在Oracle PL/SQL中游标声明中表名动态变化的方法
  • oracle 声明游标(不具备字段)规则应用
  • Oracle存储过程返回游标实例详解
  • oracle 在一个存储过程中调用另一个返回游标的存储过程
  • Oracle 游标使用总结
  • Oracle 数据库(oracle Database)性能调优技术详解
  • oracle中lpad函数的用法详解
  • oracle修改scott密码与解锁的方法详解
  • 求.bash_profile配置oracle详解
  • Oracle数据库中分区功能详解
  • oracle指定排序的方法详解
  • 详解如何应用改变跟踪技术加速Oracle递增备份
  • oracle合并列的函数wm_concat的使用详解
  • oracle select执行顺序的详解
  • 使用Oracle数据挖掘API方法详解[图文]
  • Oracle多表级联更新详解
  • 安装Linux与Oracle数据库步骤详解
  • oracle求同比,环比函数(LAG与LEAD)的详解
  • 详解Linux平台下的Oracle数据库编程
  • oracle中去掉回车换行空格的方法详解
  • Oracle中job的使用详解
  • [Oracle] Data Guard 之 Redo传输详解
  • oracle用户权限管理使用详解
  • 深入ORACLE变量的定义与使用的详解
  • 详解Oracle的几种分页查询语句
  • oracle SQL递归的使用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • Oracle9i 9.0.1的JDBC Drivers 可以给Oracle 8.0.5使用马?
  • Suse linux使用oracle问题
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • jbuilder中使用oracle的问题
  • 求redhat linux 9.0下可以使用的oracle 10g或9i,还有redhat linux 9.0下可以使用的eclipse下载地址
  • 在Jbuilder7下,使用DbPilot.exe连接oracle,报错!请教高手!
  • AIX 64位系统上如何使用32位OCI oracle driver
  • Oracle中SQL语句连接字符串的符号使用介绍
  • 使用X manager连接oracle数据库的步骤
  • C++使用OCCI连Oracle10g的错误
  • 使用工具 plsqldev将Excel导入Oracle数据库
  • Linux下Oracle的sqlplus使用光标上下左右方法
  • oracle使用sql脚本生成csv文件案例学习
  • ORACLE 修改表结构 之ALTER CONSTAINTS的使用
  • Linux中Oracle使用相关知识集锦
  • Oracle密码文件的使用和维护第1/3页
  • Oracle 触发器的使用小结
  • Oracle SQL使用时注意自己的输入
  • Oracle Max函数使用中出现的问题
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,