2010-11-27 53 views
1

我有一个存储过程,它返回一个游标。Oracle Pl/sql从多个查询中返回一个游标

应用程序将一个参数传递给确定应该提取多少个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左右 编号1具有(1,2,3,4,5)编号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倍了很多,有一个美好的周末;)

回答

5

想必你必须确定前三名的一些标准?

无论如何,实现这一目标的方法是具有分析功能。 Oracle提供三种不同的函数:ROW_NUMBER(),RANK()和DENSE_RANK()。这些提供了3个略有不同的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岬列。

+0

我有一种方法可以确定ID的每个od的前3位。 – 2010-11-27 18:03:42

+0

@Udi l:这就是分析/排名/窗口函数的`PARTITION BY id`部分所做的(在这种情况下是ROW_NUMBER)。 – 2010-11-27 18:11:25

-2

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

create global temporary table temp_table_name 

Link to more information

然后在for循环中,你可以插入行的所有所需的ID的临时表。返回的游标将成为临时表的内容。当然,这种解决方案只有在无法从单个sql查询中得到结果时才有意义