知识大全 PL/SQL-嵌套游标cursor

Posted

篇首语:世界上三种东西最宝贵本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 PL/SQL-嵌套游标cursor相关的知识,希望对你有一定的参考价值。

PL/SQL-嵌套游标cursor  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

        cursor() 函数可以将一个查询结果集封装成一个类似 REF CURSOR 的游标变量 可以 FETCH 记录 也可以作为 REF CURSOR 类型的参数进行传递 它被称为 嵌套游标(nested cursor)         FETCH 记录         我们先看一下测试表 test 和 test 的数据   SQL> select * from test ;            A                                       SQL> select * from test ;           ID NAME          yuechaotian          yuechaotian          yuechaotian          yuechaotian          yuechaotian     我们可能会发出这样一个查询   SQL> select id name (select a from test where a = test id)      from test ;select id name (select a from test where a = test id)                  *ERROR 位于第 行:ORA : 单行子查询返回多个行     因为表 test 中有两条 a= 的记录 所以这个查询执行失败了 但有时候我们确实需要这样的查询 怎么办呢?你可以试试 cursor() 函数   SQL> set serveroutput on SQL> declare      cursor cur_test is        select id name cursor(select a from test where a = test id)          from test ;      rec_test test %rowtype;        cur_test sys_refcursor;      rec_test test %rowtype;    begin      open cur_test ;      loop        fetch cur_test into rec_test id rec_test name cur_test ;        exit when cur_test %notfound;        dbms_output put_line( rec_test id: || rec_test id || | rec_test name: || rec_test name);        这里不需要再显式 OPEN 游标 cur_test 也不需要显式关闭        loop          fetch cur_test into rec_test ;          exit when cur_test %notfound;          dbms_output put_line( rec_test a: || rec_test a );        end loop;      end loop;       close cur_test ;    end;    /rec_test id: | rec_test name: yuechaotian rec_test a: rec_test a: rec_test id: | rec_test name: yuechaotian rec_test a: rec_test id: | rec_test name: yuechaotian rec_test a: rec_test id: | rec_test name: yuechaotian rec_test id: | rec_test name: yuechaotian   PL/SQL 过程已成功完成       怎么样?达到你的目的了吧 我们再看一个嵌套了两个 cursor() 函数的例子   SQL> declare      嵌套定义游标      cursor cur_test is        select id name cursor(select a cursor(select * from dual)                                            from test                                           where test a = test id)          from test ;      cur_test sys_refcursor;      cur_dual  sys_refcursor;      rec_test test %rowtype;      rec_test test %rowtype;      rec_dual varchar ( );    begin      open cur_test ;      loop        fetch cur_test into rec_test id rec_test name cur_test ;        exit when cur_test %notfound;        dbms_output put_line( rec_test id: || rec_test id ||    rec_test name: || rec_test name);        这里不需要再显式 OPEN 游标 cur_test 也不需要显式关闭        loop          fetch cur_test into rec_test a cur_dual;          exit when cur_test %notfound;          dbms_output put_line( rec_test a: || rec_test a );          这里不需要再显式 OPEN 游标 cur_dual 也不需要显式关闭          loop            fetch cur_dual into rec_dual;            exit when cur_dual%notfound;            dbms_output put_line( rec_dual: || rec_dual );          end loop;        end loop;      end loop;      close cur_test ;    end;    /rec_test id:    rec_test name: yuechaotian rec_test a: rec_dual: Xrec_test a: rec_dual: Xrec_test id:    rec_test name: yuechaotian rec_test a: rec_dual: Xrec_test id:    rec_test name: yuechaotian rec_test a: rec_dual: Xrec_test id:    rec_test name: yuechaotian rec_test id:    rec_test name: yuechaotian   PL/SQL 过程已成功完成           由以上例子可以看出 嵌套游标是隐式打开的 它在以下情况下被关闭         显式关闭           父游标再次执行时(比如 下一次循环前 会先关闭嵌套游标 再根据新数据重新打开)           父游标关闭时           父游标退出时         fetch 父游标出错时         传递参数         我们先看看测试表中的数据   SQL> select * from test ;           ID NAME          yuechaotian          yuechaotian          yuechaotian          yuechaotian          yuechaotian          yuechaotian          yuechaotian          yuechaotian          yuechaotian         yuechaotian   已选择 行   SQL> select * from test order by a;            A                                                                                             已选择 行       下面我要查询 test 中的数据 查询条件是 test id 在 test a 中对应的记录数 比如我要查询表 test id 在 test a 中不存在的记录 查询表 test id 在test a 中存在 条的记录 存在 条的记录 存在 条的记录…… 我可以使用嵌套游标实现   SQL> create function f_count(cur_names in sys_refcursor) return number    is      v_name test name%type;      n_count number( ) := ;    begin      loop        fetch cur_names into v_name;        exit when cur_names%notfound;        n_count := n_count + ;      end loop;      return n_count;    end f_count;    /   函数已创建   SQL> select id name      from test      where f_count( cursor( select a from test where a = test id ) ) = ;           ID NAME          yuechaotian          yuechaotian          yuechaotian   SQL> select id name      from test      where f_count( cursor( select a from test where a = test id ) ) = ;           ID NAME          yuechaotian          yuechaotian          yuechaotian         yuechaotian   SQL> select id name      from test      where f_count( cursor( select a from test where a = test id ) ) = ;           ID NAME          yuechaotian          yuechaotian   SQL> select id name      from test      where f_count( cursor( select a from test where a = test id ) ) = ;           ID NAME          yuechaotian cha138/Article/program/Oracle/201311/17957

相关参考

知识大全 PL/SQL的SELECT FOR UPDATE游标

PL/SQL的SELECTFORUPDATE游标  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 oracle光标的使用

  在PL/SQL程序中对于处理多行记录的事务经常使用光标来实现  一显式光标在PL/SQL程序中定义的光标称作显式光标  显式光标处理需四个PL/SQL步骤:  cursor 光标名称&n

知识大全 oracle中的游标使用静态游标

  游标是构建在PL/SQL中用来查询数据获取记录集的指针它让开发者一次访问结果集中一行记录  在oracle中提供了两种游标静态游标ref游标  静态游标静态游标是在编译的时候就被确定然后把结果集复

知识大全 PL/SQL最差实践

PL/SQL最差实践  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  超长的PL/SQL代码  影

知识大全 PL/SQL程序结构(组图)

PL/SQL程序结构(组图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  什么是PL/SQL程

知识大全 pl/sql查询字段为科学计数法

  从pl/sql查询字段类型为number并且长度大于位的内容显示为科学计数法的计数方法  pl/sql  从pl/sql查询字段类型为number并且长度大于位的内容显示为科学计数法的计数方法后经

知识大全 PL/SQL中用光标查询多条记录

PL/SQL中用光标查询多条记录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PL/SQL光标

知识大全 PL/SQL用光标查询多条记录

PL/SQL用光标查询多条记录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PL/SQL光标为

知识大全 全面探讨PL/SQL的复合数据类型

全面探讨PL/SQL的复合数据类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PL/SQL有

知识大全 PL/SQL命名作用域的窍门

PL/SQL命名作用域的窍门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多PL/SQL程序