如何在结果集中包含单行多列子查询(PIPELINED函数)结果
How to include single row multiple column subquery (PIPELINED function) results in the result set
我正在使用 Oracle 11g。
所以,假设我有一个像这样的测试数据 table
with test_data as (
select 1 as id, 'John' as name from dual
union all
select 2 as id, 'Jack' as name from dual
union all
select 3 as id, 'Peter' as name from dual
)
我还有一个 piplined
函数,每次调用 return 一行 , 多列 像下面这样:
CREATE OR REPLACE PACKAGE MY_PACK AS
TYPE result_record is RECORD(
surname varchar2(27),
telephone varchar2(50),
place_of_birth varchar2(50)
);
TYPE result_table IS TABLE OF result_record;
function runPipe(id number) RETURN result_table PIPELINED;
END ERC_PACK;
/
CREATE OR REPLACE PACKAGE BODY MY_PACK AS
function runPipe(id number) RETURN result_table PIPELINED IS
rec result_record:=null;
begin
if (id=1) then
select 'Smih','139289289','Paris' into rec from dual;
end if;
if (id=2) then
select 'Lock','1888888888','London' into rec from dual;
end if;
if (id=3) then
select 'May','99999999999','Berlin' into rec from dual;
end if;
pipe row (rec);
return;
end;
END ERC_PACK;
/
当然还有
select * from table(MY_PACK.runPipe(1))
return秒
Smih 139289289 Paris
现在我想要一个 select 语句,它将 return test_data
的所有行以及来自管道函数
的相应值
例如像
select test_data.*, (select * from table(MY_PACK.runPipe(id))) from test_data
哪个当然不行
但是预期结果会是这样的:
1 John Smih 139289289 Paris
2 Jack Lock 1888888888 London
3 Peter May 99999999999 Berlin
那么在给定test_data
table 和pipelined
函数的情况下,如何实现上述预期结果呢?
你可以使用 OUTER APPLY
:
select td.*, s.*
from test_data td
outer apply (select * from table(MY_PACK.runPipe(td.id))) s
试试这个 select :
with test_data as (
select 1 as id, 'John' as name from dual
union all
select 2 as id, 'Jack' as name from dual
union all
select 3 as id, 'Peter' as name from dual
)
select td.*, s.*
from test_data td
LEFT JOIN table(MY_PACK.runPipe(td.id)) s ON 1 = 1;
请尝试使用别名
with test_data as (
select 1 as id, 'John' as name from dual
union all
select 2 as id, 'Jack' as name from dual
union all
select 3 as id, 'Peter' as name from dual
)
select * from table(MY_PACK.runPipe(test_data.id))) from test_data
我正在使用 Oracle 11g。
所以,假设我有一个像这样的测试数据 table
with test_data as (
select 1 as id, 'John' as name from dual
union all
select 2 as id, 'Jack' as name from dual
union all
select 3 as id, 'Peter' as name from dual
)
我还有一个 piplined
函数,每次调用 return 一行 , 多列 像下面这样:
CREATE OR REPLACE PACKAGE MY_PACK AS
TYPE result_record is RECORD(
surname varchar2(27),
telephone varchar2(50),
place_of_birth varchar2(50)
);
TYPE result_table IS TABLE OF result_record;
function runPipe(id number) RETURN result_table PIPELINED;
END ERC_PACK;
/
CREATE OR REPLACE PACKAGE BODY MY_PACK AS
function runPipe(id number) RETURN result_table PIPELINED IS
rec result_record:=null;
begin
if (id=1) then
select 'Smih','139289289','Paris' into rec from dual;
end if;
if (id=2) then
select 'Lock','1888888888','London' into rec from dual;
end if;
if (id=3) then
select 'May','99999999999','Berlin' into rec from dual;
end if;
pipe row (rec);
return;
end;
END ERC_PACK;
/
当然还有
select * from table(MY_PACK.runPipe(1))
return秒
Smih 139289289 Paris
现在我想要一个 select 语句,它将 return test_data
的所有行以及来自管道函数
例如像
select test_data.*, (select * from table(MY_PACK.runPipe(id))) from test_data
哪个当然不行 但是预期结果会是这样的:
1 John Smih 139289289 Paris
2 Jack Lock 1888888888 London
3 Peter May 99999999999 Berlin
那么在给定test_data
table 和pipelined
函数的情况下,如何实现上述预期结果呢?
你可以使用 OUTER APPLY
:
select td.*, s.*
from test_data td
outer apply (select * from table(MY_PACK.runPipe(td.id))) s
试试这个 select :
with test_data as (
select 1 as id, 'John' as name from dual
union all
select 2 as id, 'Jack' as name from dual
union all
select 3 as id, 'Peter' as name from dual
)
select td.*, s.*
from test_data td
LEFT JOIN table(MY_PACK.runPipe(td.id)) s ON 1 = 1;
请尝试使用别名
with test_data as (
select 1 as id, 'John' as name from dual
union all
select 2 as id, 'Jack' as name from dual
union all
select 3 as id, 'Peter' as name from dual
)
select * from table(MY_PACK.runPipe(test_data.id))) from test_data