带有过程调用的 Oracle 多列子查询
Posted
技术标签:
【中文标题】带有过程调用的 Oracle 多列子查询【英文标题】:Oracle Multi Column Subquery with a procedure call 【发布时间】:2018-05-16 17:12:03 【问题描述】:我有一个有趣的工作问题。我有一个由其他人编写的 Oracle 程序,它为单个输入人员 ID 返回一个数据集(多列、多行)。我需要使用此过程来获取所有人员 ID 的数据集。
可以通过将输出转换为表格来查询该过程:
"select * from table (package.proc(in_ID))"
我知道如何查询的唯一方法是像这样进行多个 proc 调用:
select ID,
(select col1 from table(package.proc(persons.ID)) as col1,
(select col2 from table(package.proc(persons.ID)) as col2, --(etc...)
from persons
但是,对于我需要从这个东西中获取的行数和列数,这是非常低效的,并且会导致服务器超时。此外,子选择只能从 proc 中获取一行,因此我也缺少行(或者如果它返回多于一行,则会在子选择上出错)。
有没有一种方法可以做到这一点,而不涉及重写过程以返回所有人员 ID 的数据?
【问题讨论】:
【参考方案1】:从 Oracle 12c 开始,您可以使用 CROSS/OUTER APPLY
:
SELECT *
FROM persons p
OUTER APPLY(TABLE(package.proc(p.ID))) s;
【讨论】:
我相信这行得通。由于某种原因,我得到了很多空白行,但我想要的数据就在那里。 @bobbythefish 如果函数没有返回任何行,您将得到NULL
。为避免这种情况,您可以使用CROSS APPLY
以上是关于带有过程调用的 Oracle 多列子查询的主要内容,如果未能解决你的问题,请参考以下文章