老问题并且已经正确回答了我知道,但由于这是“oracle cursor to csv”的热门谷歌点击之一,我刚刚写了一些东西来做到这一点,我想我会发布一个新的答案。
从 Oracle 11.2 开始,DBMS_SQL 可以处理普通的引用游标,而不仅仅是像 Tom Kyte 的 2000 解决方案中的字符串。您使用将其摄取到 DBMS_SQL
l_cursor_id := dbms_sql.to_cursor_number(your_refcursor);
(l_cursor_id
然后将包含一个无意义的生成数字,DBMS_SQL 使用它来跟踪其相应的内部值。)
由于 ref 游标已经打开并解析,您跳过这些步骤并调用
dbms_sql.describe_columns(l_cursor_id, l_col_count, l_cursor_columns);
其中l_cursor_columns
(DBMS_SQL 为您填充的 OUT 参数)是 a dbms_sql.desc_tab
,它是一个列定义数组,其中填充了查询中每一列的条目并包含列名、数据类型等,并且l_col_count
有些冗余地包含与l_cursor_columns.count
. 然后,您需要遍历这个数组调用dbms_sql.define_column
,以告诉 DBMS_SQL 使用它刚刚告诉您的数据类型来处理每一个,这是一个相当冗长的步骤,我永远看不到重点。(它确实允许您将所有'%CHAR%'
类型视为varchar2
etc,所以我想它允许一些灵活性。)
那么这只是一个dbms_sql.fetch_rows
循环调用并处理结果的问题。我把它放在一个接受 ref 游标参数的流水线表函数中,所以你会得到这样的结果:
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