2017-07-27 45 views
0

我想要一種使用sql * plus將Oracle 11g中的任何給定表動態導出爲csv的方法 - 而不是每次都需要明確地硬編碼列名。如何使用sqlplus將oracle中的任何給定表輸出到csv

+0

歡迎來到SO。 [this](https://asktom.oracle.com/pls/apex/f?p=100:11:::NO::P11_QUESTION_ID:88212348059)應該讓你開始。如果切換到SQLcl,則不必編寫代碼。 – jeff6times7

+0

對不起,我應該補充說明 - 在我的例子中,我的公司使用了一個基於德國的提供商來管理我們的數據庫。雖然我可以使用UTL_FILE解決方案,但我認爲訪問該文件會很困難。已經有人建議設立SFTP,但在這方面進展往往令人沮喪。這就是爲什麼直接使用sqlplus編寫csv實際上更簡單 - 雖然也許更骯髒 - 選項 – Connor

回答

0

搜索堆棧溢出後,我無法找到這個問題的確切答案 - 因此我開發了我自己的解決方案。

下面是SQL腳本,我寫道:

SET echo off 
SET verify off 
SET heading off 
SET pages 50000 
SET feedback off 
SET newpage none 
SET termout off 
SET linesize 900 
SET trimspool on 
SET serveroutput on 

define table_name = &1 
define spool_path = &2 
var rc refcursor 
column qry new_val capture 

SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry 
    FROM user_tab_cols 
WHERE table_name = '&table_name'; 



spool &spool_path 

SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_id) 
    FROM user_tab_cols 
WHERE table_name = '&table_name'; 

BEGIN 

FOR v_rec IN (&capture) LOOP 

dbms_output.put_line(v_rec.rec); 

END LOOP; 

END; 
/

spool off 

EXIT 

該腳本需要兩個參數 - 第一個參數是表名,第二個是閥芯路徑。

本質上,第一查詢:

SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry 
    FROM user_tab_cols 
WHERE table_name = '&table_name'; 

動態創建使用user_tab_cols和LISTAGG到每個列名強制成一條線一個新的選擇語句(其加載到&捕獲替代變量) - 這個動態創建的選擇語句基本上將每列連接在一起,並用逗號分隔。稍後,當我們通過動態生成的select語句來循環時,會生成每行數據。

標題是由一個類似的查詢產生的(第一個動作一旦我們開始假脫機),但是爲此我們可以直接列出列標題名稱。

通過在您選擇的表格上測試兩個查詢來查看結果,可以更容易理解!

0

請使用以下語法。

SET MARKUP HTML ON SPOOL ON 
HEAD "<title>Data Extract</title> - <meta http-equiv='Content-Type' content='application/vnd.ms-excel;'> 
<style type='text/css'> 
</style>" 
SET ECHO OFF 
SPOOL output.xls 
select * from &tablename ; 
spool off 
exit 

提示時輸入表名。

Abhi

+0

這有幾個問題 - 最終不會生成.csv文件。它還會定期重複列標題。 – Connor

+0

Hello Connor - 請添加「設置標題關」刪除重複的標題。 &是的,我意識到它是XLS的代碼,但是您可以將xls保存爲.csv並在任何其他編輯器中打開。 –

+0

這是真的,但這也是一個額外的步驟 - 要麼我需要手動打開文件轉換或寫在VBA腳本或類似 – Connor

0

您可以使用SET Colsep選項。

SET COLSEP "," 
SET PAGES 0 
SET FEEDBACK OFF 
SPOOL output.csv 
select * from HR.employees; 
spool off 
exit 
+0

我可能已經跳過了一下槍 - 我開始提取一張表作爲測試,它好像是在終端輸出數據,但是完成後的csv是一團糟。 – Connor

+0

您可以使用其他Col分離器。像「|」 。如果您在Excel中打開,則可以將數據 - >文本轉換爲列 - >由「|」分隔。 –

+0

我更喜歡在單個清理步驟中生成乾淨的CSV的解決方案。我認爲這也是將行分成多行,而不是分隔符問題? – Connor

相關問題