SQL Server能够在一次往返中返回多个查询的结果,例如:
select a, b, c from y;
select d, e, f from z;
Run Code Online (Sandbox Code Playgroud)
Oracle不喜欢这种语法.可以使用引用游标,如下所示:
begin
open :1 for select count(*) from a;
open :2 for select count(*) from b;
end;
Run Code Online (Sandbox Code Playgroud)
但是,您在打开/关闭游标时会受到惩罚,并且您可以长时间保持数据库锁定.我想做的是使用Odp.net一次性检索这两个查询的结果.可能吗?
在Oracle中,引用游标是指向数据的指针,而不是数据本身.因此,如果一个过程返回两个引用游标,则客户端仍然必须从这些游标中获取行(并引发网络命中).
因此,如果数据量很小,您可能希望调用只返回值的过程.如果数据量很大(数千行),那么它无论如何都不会是单个网络旅行,因此当你在游标之间切换时,额外的一两个不会产生太大的影响.
另一种选择是单个选择返回所有行.这可能是一个简单的UNION ALL
select a, b, c from y union all select d, e, f from z;
Run Code Online (Sandbox Code Playgroud)
它可以是流水线表功能
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);
Run Code Online (Sandbox Code Playgroud)
我相信最新版本的ODP for 11g允许用户定义的类型可能有所帮助.
| 归档时间: |
|
| 查看次数: |
2584 次 |
| 最近记录: |