2014-12-04 86 views
1

我正在写一个sql脚本来导出csv文件中表的内容(每个文件一个表)。我设法写一个成功的剧本,由于这样的脱机功能:在csv文件中导出oracle表

spool export.csv append 

select 'fielda;fieldb;...' from dual 
select fielda,fieldb,.... from table 

spool off. 

这样做的第一个问题,是我必须做一个选择从双到第一行只得到字段名称。

第二个问题是,我必须写每个字段,并且当您有10个表中的每个字段超过20个时,它变得非常痛苦。所以我的问题是,是否有任何pl sql函数,它只需要参数表名,并将全部内容导出到csv文件中。

在此先感谢。

+1

你为什么不使用的SQLDeveloper输出,附带甲骨文 – Exhausted 2014-12-04 10:07:39

+0

我有Windows服务器上安装Oracle数据库。我无法安装SQL开发人员,我需要开发一个sql脚本,这将由于每天晚上的vbs脚本而执行。所以我正在尝试优化sql脚本,而不必手动编写每个字段。理想情况下,将是一个sql脚本,它接受表名称的侦听,并且每个脚本都将其内容导出为具有相同名称的csv文件。 – user2443476 2014-12-04 10:16:54

+0

FWIW,SQL Developer包含在Oracle数据库中 - 它位于$ ORACLE_HOME中 - 所以你确实拥有它。不要说脚本不是一个有效的解决方案。 – thatjeffsmith 2014-12-04 13:50:55

回答

0

没有,但你可以使用user_tablesuser_tab_cols选择感兴趣表中的列:

select utc.table_name, utc.column_name 
    from user_tab_cols utc 
    where utc.table_name = 'CIRCUIT' 

你可以通过游标管理这并生成您的选择列。然后你可以执行这个查询。

+0

问题是我得到一个表,例如,一个ligne中的每个字段名,而不是一行与所有由';'隔开的fielsnames。像我的双重要求。 – user2443476 2014-12-04 10:51:24

+0

也许你的问题是“是否有任何pl sql函数,只取参数表名,并将全部内容导出为csv文件”。答案是否定的,但是,有一个表格可以让你通过表格名称生成正确的sql(并且可以使用它来生成名称标题)。你可以定义你自己的“CSV_TABLE”,它只包含那些要导出的表名,并用'user_tab_cols'来管理这个世代(简单连接)。它有你自己的简单proc的气质,不是吗? – wmorrison365 2014-12-04 13:32:58

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; 
/
0

您可以使用Python和cx_Oracle模块以CSV格式提取数据到磁盘。

下面介绍如何使用您cx_Oracle连接到Oracle:

constr='scott/[email protected]:1521/ORCL12' 
con = cx_Oracle.connect(constr) 
cur = con.cursor() 

数据以CSV格式取出后可以循环通过Python列表和保存数据。

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') 

我用这种方法,当我写TableHunter-For-Oracle