2009-09-16 158 views
13

我正在使用Oracle SQL Developer並嘗試將表格導出到CSV文件。某些字段是CLOB字段,並且在很多情況下,輸出發生時會截斷條目。我正在尋找一種方法來解決問題,因爲我的最終目標是在這裏不使用Oracle(我收到了一個Oracle轉儲文件 - 它被加載到一個oracle數據庫中,但是以另一種格式使用數據,所以要通過CSV作爲中介)。使用Oracle SQL Developer將CLOB導出到文本文件

如果有多種解決方案,對於我來說這是一次性過程,我不介意更多的黑客類型解決方案更多地涉及「做對」解決方案。

回答

13

如果你有機會到文件系統上的數據庫中,您可以做這樣的事情:

CREATE OR REPLACE DIRECTORY documents AS 'C:\'; 
SET SERVEROUTPUT ON 
DECLARE 
    l_file UTL_FILE.FILE_TYPE; 
    l_clob CLOB; 
    l_buffer VARCHAR2(32767); 
    l_amount BINARY_INTEGER := 32767; 
    l_pos  INTEGER := 1; 
BEGIN 
    SELECT col1 
    INTO l_clob 
    FROM tab1 
    WHERE rownum = 1; 

    l_file := UTL_FILE.fopen('DOCUMENTS', 'Sample2.txt', 'w', 32767); 

    LOOP 
    DBMS_LOB.read (l_clob, l_amount, l_pos, l_buffer); 
    UTL_FILE.put(l_file, l_buffer); 
    l_pos := l_pos + l_amount; 
    END LOOP; 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.put_line(SQLERRM); 
    UTL_FILE.fclose(l_file); 
END; 
/

這我複製並粘貼from this site

您可能也會覺得這previous question about UTL_FILE有用。它解決了導出爲CSV的問題。然而,我不知道UTL_FILE如何處理CLOB。

+0

UTL_FILE可以處理CLOB相當不錯,在9i和更大的日子裏,它就像處理一個VARCHAR2。 – 2009-09-16 18:04:30

+0

嗯,我無法訪問那臺機器,但是如果我不能直接執行操作,我恐怕會嚇到一個人。 – geoffjentry 2009-09-16 18:06:03

+0

UTL_FILE可以作爲用戶運行,我確實相信。 – 2009-09-16 18:06:56

0

假設你的意思是一個.dmp(無論是從出口或expdp)的Oracle轉儲,你正在尋找一個二進制文件。您需要將轉儲文件導入Oracle數據庫,然後使用UTL_FILE或其他方式將數據導出爲純文本。

+0

它已經被加載到一個oracle數據庫中,它只是我的最終目標不是oracle,所以我把我想要的那些數據作爲CSV提取出來,並以這種方式處理它們。這一直工作,直到我遇到CLOB – geoffjentry 2009-09-16 18:05:25

0

下面是一個簡短但一般的Python腳本,不只是這一點 - 傾銷表(含CLOB場,其餘之間),以平面CSV文件:OraDump

2

您可以使用Python腳本採取的護理出口,該CLOB的不會被截斷:

from __future__ import print_function 
from __future__ import division 

import time 
import cx_Oracle 

def get_cursor(): 
    ''' 
    Get a cursor to the database 
    ''' 
    # https://stackoverflow.com/questions/24149138/cx-oracle-doesnt-connect-when-using-sid-instead-of-service-name-on-connection-s 
    # http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html 
    ip = '' # E.g. '127.0.0.1' 
    port = '' # e.g. '3306' 
    sid = '' 
    dsnStr = cx_Oracle.makedsn(ip, port, sid) 
    username = '' # E.g. 'FRANCK' 
    password = '' # E.g. '123456' 
    db = cx_Oracle.connect(user=username, password=password, dsn=dsnStr)  
    cursor = db.cursor() 
    return cursor 

def read_sql(filename): 
    ''' 
    Read an SQL file and return it as a string 
    ''' 
    file = open(filename, 'r') 
    return ' '.join(file.readlines()).replace(';', '') 

def execute_sql_file(filename, cursor, verbose = False, display_query = False): 
    ''' 
    Execute an SQL file and return the results 
    ''' 
    sql = read_sql(filename) 
    if display_query: print(sql) 
    start = time.time() 
    if verbose: print('SQL query started... ', end='') 
    cursor.execute(sql) 
    if verbose: 
     end = time.time() 
     print('SQL query done. (took {0} seconds)'.format(end - start)) 
    return cursor 


def main(): 
    ''' 
    This is the main function 
    ''' 
    # Demo: 
    cursor = get_cursor() 
    sql_filename = 'your_query.sql' # Write your query there 
    cursor = execute_sql_file(sql_filename, cursor, True)  
    result_filename = 'result.csv' # Will export your query result there 
    result_file = open(result_filename, 'w') 
    delimiter = ','  
    for row in cursor: 
     for count, column in enumerate(row): 
      if count > 0: result_file.write(delimiter) 
      result_file.write(str(column)) 
     result_file.write('\n') 
    result_file.close() 


if __name__ == "__main__": 
    main() 
    #cProfile.run('main()') # if you want to do some profiling 

FYI:Help installing cx_Oracle

相關問題