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 Ids 所以 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 从多个查询中返回一个游标的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle 函数返回多个值

从基于 PL/SQL 函数体返回 SQL 查询的 Oracle APEX 5 经典报告下载到 Excel 选项,

Oracle - pl sql 从 SYS_REFCURSOR 中选择

PL/SQL 新手 - 返回多个结果集问题

带有参数的 PL/SQL 过程/函数从选择查询返回表

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)