知识大全 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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在PL/SQL程序中对于处理多行记录的事务经常使用光标来实现 一显式光标在PL/SQL程序中定义的光标称作显式光标 显式光标处理需四个PL/SQL步骤: cursor 光标名称&n
游标是构建在PL/SQL中用来查询数据获取记录集的指针它让开发者一次访问结果集中一行记录 在oracle中提供了两种游标静态游标ref游标 静态游标静态游标是在编译的时候就被确定然后把结果集复
PL/SQL最差实践 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 超长的PL/SQL代码 影
PL/SQL程序结构(组图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 什么是PL/SQL程
从pl/sql查询字段类型为number并且长度大于位的内容显示为科学计数法的计数方法 pl/sql 从pl/sql查询字段类型为number并且长度大于位的内容显示为科学计数法的计数方法后经
PL/SQL中用光标查询多条记录 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PL/SQL光标
PL/SQL用光标查询多条记录 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PL/SQL光标为
全面探讨PL/SQL的复合数据类型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PL/SQL有
PL/SQL命名作用域的窍门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 很多PL/SQL程序