带有过程调用的 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 多列子查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle!你必须要知道的Knowledge points(下)

Oracle入门第六天(下)——高级子查询

mysql子查询

Oracle_071_lesson_p16

子查询(章节摘要)

SQL练习 高级子查询