2012-10-15 17 views
1

在我的應用程序中的許多地方,我需要將數據顯示爲CSV。如何編寫可重用函數以從查詢返回CSV輸出?

爲此,我通常會循環遊標並構建CSV。

for j in c_get_mydata loop 
    v_CSV := v_CSV || ', ' || j.column_value; 
end loop; 

我如何寫一個可重複使用的功能,可以接受查詢並返回一個字符串CSV?你是否建議把這個作爲一個單獨的函數來處理,還是處理上面的每個查詢都更好?如果你建議把它作爲一個單獨的函數,你是否建議函數將查詢字符串或合成光標作爲輸入?

編輯:

澄清:我想顯示數據的單列作爲一行,用逗號分開。

如:Tom, Dick, Harry, Sally

我不希望顯示在多行多列數據爲:

Tom, 18, London 
Dick, 22, New York 
Harry, 16, San Fransisco 
Sally, 18, Paris 

編輯2:

我發現了關於收集功能:

select collect(employee_name)
fro m員工

這會返回給我一個數據集,但是如何將其轉換爲字符串?

+0

結束了使用此解決方案:HTTP:// www.oracle-developer.net/display.php?id=306 – Zesty

回答

3

最簡單的選擇通常是使用DBMS_SQL包。 Tom Kyte以他的dump_csv procedure爲例。當然,您可能希望將結果寫入CLOB,而不是使用utl_file將其寫入文件,但這是相對容易的調整。

0

老問題,已經正確回答我知道,但因爲這是「oracle cursor to csv」的最高谷歌命中之一,我剛剛寫了一些事情來做到這一點,我想我會發佈一個新的答案。

從Oracle 11.2開始,DBMS_SQL可以像Tom Kyte的2000解決方案那樣處理普通的引用而不僅僅是一個字符串。您可以使用

l_cursor_id := dbms_sql.to_cursor_number(your_refcursor); 

攝取入DBMS_SQL(l_cursor_id然後將包含DBMS_SQL使用其相應的內部值跟蹤毫無意義生成的數字。)

由於裁判光標已經打開並分析,你跳過那些步驟和呼叫

dbms_sql.describe_columns(l_cursor_id, l_col_count, l_cursor_columns); 

其中l_cursor_columnsdbms_sql.desc_tab,它是填充了爲電子的條目的列定義的陣列(即DBMS_SQL填充爲你的OUT參數)在查詢中包含列名,數據類型等,並且l_col_count有點冗餘地包含與l_cursor_columns.count相同的值。然後你需要循環調用dbms_sql.define_column這個數組來告訴DBMS_SQL使用它剛剛告訴你的數據類型來處理每一個數據類型,這是一個我永遠無法完全看清的點。(它允許你把所有的'%CHAR%'類型爲varchar2等,所以我想它允許一定的靈活性。)

然後,它只是一個調用循環dbms_sql.fetch_rows和處理結果的問題。我把這個在接受裁判光標參數流水線表函數,所以你得到的東西是這樣的:

select column_value 
from table(csv.report(cursor(
      select * from dept -- << Use any query here 
     ))); 

COLUMN_VALUE 
---------------------------------------------- 
10,ACCOUNTING,NEW YORK 
20,RESEARCH,DALLAS 
30,SALES,CHICAGO 
40,OPERATIONS,BOSTON 

4 rows selected. 

完整的書面記錄和代碼在這裏: www.williamrobertson.net/documents/refcursor-to-csv.shtml

相關問題