【发布时间】:2018-12-21 05:26:20
【问题描述】:
在Oracle中,如果我有以下两个表
CREATE TABLE Test_Persons_A (
PersonID int,
LastName varchar(255),
FirstName varchar(255)
);
INSERT INTO Test_Persons_A
(PersonID,LastName,FirstName)
values(11,'LN_A1','FN_A1');
INSERT INTO Test_Persons_A
(PersonID,LastName,FirstName)
values(12,'LN_A2','FN_A2');
CREATE TABLE Test_Persons_B (
PersonID int,
LastName varchar(255),
FirstName varchar(255)
);
INSERT INTO Test_Persons_B
(PersonID,LastName,FirstName)
values(21,'LN_B1','FN_B1');
INSERT INTO Test_Persons_B
(PersonID,LastName,FirstName)
values(22,'LN_B2','FN_B2');
commit;
我可以对联合进行如下查询:
with
UNIONED as
(
--block A to replaced by calling a function or stored proc---
select PersonID as PID, LastName as LN, FirstName as FN
from Test_Persons_A tp
where tp.LASTNAME like '%1%'
union
--block B to replaced by calling a function or stored proc---
select PersonID as PID, LastName as LN, FirstName as FN
from Test_Persons_B tp
where tp.LASTNAME like '%2%'
)
select * from UNIONED;
我的问题是如何实现以下目标:
with
UNIONED as
(
--block A replaced---
myFuncOrStoredProc('Test_Persons_A', '%1%');
union
--block B replaced---
myFuncOrStoredProc('Test_Persons_B', '%2%');
)
select * from UNIONED;
有很多关于“如何从函数或存储过程返回表(或多行数据)”的帖子。但是由于答案众多,我感到更加困惑。
- 流水线表函数 (https://stackoverflow.com/a/2830722/2041023)
- 批量收集 (https://stackoverflow.com/a/2832735/2041023)
- 光标 (https://stackoverflow.com/a/46998148/2041023)
对于这样一个小而简单(我认为很常见)的场景和目的,什么是最干净的方法?(特别是,我更喜欢以避免必须为返回的表指定每一列的类型。)
【问题讨论】:
标签: sql oracle stored-procedures stored-functions