Oracle Pl / sql从多个查询中返回一个游标

时间:2010-11-27 17:12:44

标签: sql oracle plsql

我有一个存储过程,它返回一个游标。

应用程序将一个参数传递给过程,该过程确定应该获取多少ID,因此该过程不知道该数字的时间序列。

foreach ID我需要获取具有该ID的前3个记录。 我试过的是使用:

select * from table_name where id in (List of ID`s);

该查询有效,但我无法获得每个ID的前3位。如果我限制结果计数,我将获得第一个ID的TOP结果。

我想使用For循环,对每个ID执行查询并将结果附加到光标,但据我所知,这是不可能的。

任何想法?

更多详情 假设我有5个ID s 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个结果。

10x很多,周末愉快;)

2 个答案:

答案 0 :(得分:5)

据推测,你有一些确定前三名的标准?

无论如何,实现这一目标的方法是使用分析功能。 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的列。

答案 1 :(得分:-2)

另一个想法是定义一个Oracle临时表

create global temporary table temp_table_name

Link to more information

然后在for循环中,您可以将行插入临时表中以获取所有需要的ID。然后返回的光标将是临时表的内容。当然,只有在无法从单个sql查询中获取结果时,此解决方案才有意义