Oracle Pl/sql 从多个查询中返回一个游标
Posted
技术标签:
【中文标题】Oracle Pl/sql 从多个查询中返回一个游标【英文标题】:Oracle Pl/sql return one cursor from multiple queries 【发布时间】:2010-11-27 17:12:43 【问题描述】:我有一个存储过程,它返回一个游标。
应用程序将一个参数传递给确定应该获取多少 ID 的过程,因此该过程不知道该数字的时间头。
foreach ID 我需要获取具有该 ID 的前 3 条记录。 我尝试过的是使用:
select * from table_name where id in (List of ID`s);
该查询有效,但我无法获得每个 ID 的前 3 个。如果我限制结果数,我会得到第一个ID的TOP结果。
我认为使用 For 循环,对每个 ID 执行查询并将结果附加到光标,但据我了解这是不可能的。
有什么想法吗?
更多详情
假设我有 5 个 IDs and each of them have inner Id
s 所以
Id 1 有 (1,2,3,4,5) Id 2 (1,2,3,4,5) Id 3 (12,14,15,16,22) Id 4 (2,3,5,7 ,9) ID 5 (4,7,8,9,10)
在这种情况下,这就是我正在处理的情况,我看不出行号将如何帮助我。
我需要每个 ID 的前 3 个,在这种情况下,光标应该有 15 个结果。
10 倍,周末愉快 ;)
【问题讨论】:
【参考方案1】:大概你有一些确定前三名的标准?
无论如何,实现这一目标的方法是使用解析函数。 Oracle 提供三个不同的函数:ROW_NUMBER()、RANK() 和 DENSE_RANK()。这些提供了对 TOP 3 的三种略有不同的解释。Find out more。
这是基本思想,使用 ROW_NUMBER(),它将为每个 ID 准确返回三行。
open rc for
select * from (
select t.*
, row_number() over (partition by id order by whatever ) rn
from table_name t
where t.id in (List of ID`s)
)
where rn <= 3;
ROW_NUMBER() 子句中的 whatever
是您用来确定 TOP-ness 的列。
【讨论】:
我有办法分别确定每个 od 的前 3 个 ID。 @Udi l:这就是分析/排名/加窗函数的PARTITION BY id
部分的作用(在本例中为 ROW_NUMBER)。
你的解决方案完美无缺,这正是我所需要的。 10 倍很多。【参考方案2】:
另一个想法是定义一个 Oracle 临时表
create global temporary table temp_table_name
Link to more information
然后在 for 循环中,您可以将行插入到临时表中以获得所有需要的 id。返回的游标将是临时表的内容。当然,这种解决方案只有在无法从单个 sql 查询中获取结果时才有意义
【讨论】:
我想强调一下,这个查询的性能很关键,应该以最快的方式执行。 10 倍 :) 嗯,完全有可能从单个查询中获取结果,因此全局临时表是不必要的开销。以上是关于Oracle Pl/sql 从多个查询中返回一个游标的主要内容,如果未能解决你的问题,请参考以下文章
从基于 PL/SQL 函数体返回 SQL 查询的 Oracle APEX 5 经典报告下载到 Excel 选项,