日期:2014-05-16  浏览次数:20505 次

显示游标的使用详解
       示游标就是在声明单元明确定义的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:基于某个数据库表定义的记录类型