2010-11-27 100 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查詢中得到結果時纔有意義