2014-12-04 90 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