我正在编写一个sql脚本来导出csv文件中的表内容(每个文件一个表)。我设法编写了一个成功的脚本,这要归功于这样的假脱机功能:
spool export.csv append
select 'fielda;fieldb;...' from dual
select fielda,fieldb,.... from table
spool off.
这个问题的第一个问题是,我必须从双重中选择才能获得第一行的字段名称。
第二个问题是,我必须编写每个字段,当你有10个表,每个字段超过20个字段时,它会变得非常痛苦。所以我的问题是,是否有任何pl sql函数,只接受参数表名,并导出csv文件中的完整内容。
提前致谢。
答案 0 :(得分:2)
以下可能对您有用
set termout off
set serveroutput off
set feedback off
set colsep ';'
set lines 100000
set pagesize 0
set echo off
set feedback off
spool on
spool D:\csv_generator_tmp.sql
select qr from
(select 'select '||a.column_name||'||'';''||' qr,a.COLUMN_ID
from user_tab_cols a
where a.table_name = upper('cust')
and a.column_id=1
union
select b.column_name||'||'';''||',b.COLUMN_ID
from user_tab_cols b
where b.table_name = upper('cust') and b.column_id<>1
and b.column_id<>(select max(c.column_id) from user_tab_cols c)
union
select d.column_name||' from cust;',d.COLUMN_ID
from user_tab_cols d
where d.table_name = upper('cust')
and d.column_id=(select max(d.column_id) from user_tab_cols d))
order by column_id asc;
spool off;
spool on
spool D:\cust.csv
@D:\csv_generator_tmp.sql
spool off;
/
答案 1 :(得分:0)
否,您可以使用user_tables
和user_tab_cols
选择感兴趣的表格列:
select utc.table_name, utc.column_name
from user_tab_cols utc
where utc.table_name = 'CIRCUIT'
您可以通过游标进行管理并生成选择列。然后,您可以执行此查询。
答案 2 :(得分:0)
最好与UTL_FILE
一起使用。我会向用户询问Ask tom链接https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:88212348059
你可以通过调用函数定期创建文件。
答案 3 :(得分:0)
您可以使用Python和cx_Oracle模块以CSV格式将数据提取到磁盘。
以下是使用cx_Oracle连接Oracle的方法:
constr='scott/tiger@localhost:1521/ORCL12'
con = cx_Oracle.connect(constr)
cur = con.cursor()
获取数据后,您可以遍历Python列表并以CSV格式保存数据。
for i, chunk in enumerate(chunks(cur)):
f_out.write('\n'.join([column_delimiter.join(row[0]) for row in chunk]))
f_out.write('\n')
时使用了这种方法