2013-07-25 53 views
0

我有三個sql塊在下面。第一和第二塊工作正常。但第三隻返回一行。在我的真實世界的例子中,我有13個refcursors,每個查詢有幾列。我想避免編寫數百dbms_out.put_line(cur.column_name)的聲明如何在沒有dbms_output.put_line的情況下輸出pl/sql動態選擇中的所有行

--#1 correctly returns 8 rows. 
VAR rc REFCURSOR 
BEGIN 
OPEN :rc FOR SELECT object_id,object_name from user_objects where rownum < 9; 
END; 
print rc 
-------------------------------------------------------------- 

--#2 correctly returns 8 rows 
set serveroutput on 
BEGIN 
for cur in (select object_id,object_name from user_objects where rownum < 9) 
loop 
    dbms_output.put_line(cur.object_id); 
    dbms_output.put_line(cur.object_name); 
end loop; 
END; 
--------------------------------------------------------------- 

--#3 FAIL, only returns 1 row 
set serveroutput on 
VAR rc REFCURSOR 
BEGIN 
for cur in (select object_id,object_name from user_objects where rownum < 9) 
loop 
OPEN :rc FOR SELECT object_id,object_name from user_objects where object_id = cur.object_id; 
end loop; 
END; 
print rc 

回答

0
set serveroutput on 
VAR rc REFCURSOR 
BEGIN 
    OPEN :rc FOR SELECT object_id, object_name from user_objects where object_id IN (
    SELECT object_id FROM user_objects WHERE rownum < 9 
); 
END; 
print rc 

我不知道你需要什麼cur因爲如果一個子查詢就足夠了。無論如何光標綁定到一個選擇,並沒有簡單的方法來追加到另一個選擇動態(這是什麼UNION ALL靜態地執行

不要擔心性能,引擎(優化器)是足夠智能執行該IN(SELECT)只有在這種情況下,一旦

+0

Kubanczyk,我得到refcursor只能選擇,我只是想避免寫幾個put_line語句。注意我的真實世界的例子並不像我的stackoverflow例子那麼簡單。基本概念就像sql塊#3。運行頂部(主)選擇來獲取ID列表。然後使用頂部(主)選擇提供的id運行13條select語句,循環直到所有id都通過13個內部選擇運行 – user584583

+0

我還應該說我明白循環遍歷並不是最有效的方法以獲取數據,但古代應用程序的構建是以這種方式使用數據,並且沒有預算來修復應用程序的這一部分。 – user584583

1

這是不是非常漂亮,但你可以做這樣的事情:

VAR rc1 REFCURSOR 
VAR rc2 REFCURSOR 
VAR rc3 REFCURSOR 

BEGIN 
    for cur in (select object_id,rownum from user_objects where rownum < 4) 
    loop 
    case cur.rownum 
     when 1 then OPEN :rc1 FOR 
     SELECT object_id,object_name from user_objects 
     where object_id = cur.object_id; 
     when 2 then OPEN :rc2 FOR 
     SELECT object_id,object_name from user_objects 
     where object_id = cur.object_id; 
     when 3 then OPEN :rc3 FOR 
     SELECT object_id,object_name from user_objects 
     where object_id = cur.object_id; 
    end case; 
    end loop; 
END; 
/

print rc1 
print rc2 
print rc3 

,當你得到後的多個遊標打印出來的作品,儘可能多塊運行

如果喲你在11g上可能已經做了類似this article的建議,通過它的rc_to_dbms_sql程序。我不確定這是否完全符合短暫的內容,但它至少會自動化dbms_output一代。你可能可以做類似於dbms_sql而不是sys_refcursor,解析你的內部選擇並仍然使用過程來自動顯示結果。我不確定這是否會對你的真實世界的情況有所殺傷。

相關問題