来自Odp.net中Oracle的多个结果集,没有refcursors
发布时间:2021-01-24 19:01:51 所属栏目:站长百科 来源:网络整理
导读:SQL Server能够在一次往返中返回多个查询的结果,例如: select a,b,c from y;select d,e,f from z; Oracle不喜欢这种语法.可以使用引用游标,如下所示: begin open :1 for select count(*) from a; open :2 for select count(*) from b; end; 但是,您在打
SQL Server能够在一次往返中返回多个查询的结果,例如: select a,b,c from y; select d,e,f from z; Oracle不喜欢这种语法.可以使用引用游标,如下所示: begin open :1 for select count(*) from a; open :2 for select count(*) from b; end; 但是,您在打开/关闭游标时会受到惩罚,并且您可以长时间保持数据库锁定.我想做的是使用Odp.net一次性检索这两个查询的结果.可能吗? 解决方法在Oracle中,引用游标是指向数据的指针,而不是数据本身.因此,如果一个过程返回两个引用游标,则客户端仍然必须从这些游标中获取行(并引发网络命中). 因此,如果数据量很小,您可能希望调用只返回值的过程. 另一种选择是单个选择返回所有行.这可能是一个简单的UNION ALL select a,c from y union all select d,f from z; 它可以是流水线表功能 create or replace package test_pkg is type rec_two_cols is record (col_a varchar2(100),col_b varchar2(100)); type tab_two_cols is table of rec_two_cols; function ret_two_cols return tab_two_cols pipelined; end; / create or replace package body test_pkg is function ret_two_cols return tab_two_cols pipelined is cursor c_1 is select 'type 1' col_a,object_name col_b from user_objects; cursor c_2 is select 'type 2' col_a,object_name col_b from user_objects; r_two_cols rec_two_cols; begin for c_rec in c_1 loop r_two_cols.col_a := c_rec.col_a; r_two_cols.col_b := c_rec.col_b; pipe row (r_two_cols); end loop; for c_rec in c_2 loop r_two_cols.col_a := c_rec.col_a; r_two_cols.col_b := c_rec.col_b; pipe row (r_two_cols); end loop; return; end; end; / select * from table(test_pkg.ret_two_cols); 我相信最新版本的ODP for 11g允许用户定义的类型可能有所帮助. (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |