В 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)
Для такого небольшого и простого (и я полагаю, довольно распространенного) сценария и цели, какой самый простой способ сделать это? (в частности, я предпочитаю избегать чтобы указать тип каждого столбца для возвращаемой таблицы.)