2009-09-16 47 views
13

Tôi đang sử dụng Oracle SQL Developer và cố xuất một bảng sang tệp CSV. Một số trường là các trường CLOB và trong nhiều trường hợp, các mục được cắt bớt khi xuất khẩu xảy ra. Tôi đang tìm cách để có được toàn bộ điều, vì mục tiêu cuối cùng của tôi là không sử dụng Oracle ở đây (tôi nhận được một bãi chứa Oracle - được tải vào một db oracle, nhưng đang sử dụng dữ liệu ở định dạng khác để đi qua CSV là người trung gian).Xuất CLOB sang tệp văn bản bằng cách sử dụng Oracle SQL Developer

Nếu có nhiều giải pháp cho điều này, vì đây là thủ tục một lần cho tôi, tôi không quan tâm đến các giải pháp loại hack-ish khác để tham gia nhiều giải pháp "làm đúng".

Trả lời

13

nếu bạn có quyền truy cập vào hệ thống tập tin trên hộp cơ sở dữ liệu của bạn, bạn có thể làm một cái gì đó như thế này:

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

Mà tôi sao chép và dán from this site.

Bạn cũng có thể tìm thấy điều này previous question about UTL_FILE hữu ích. Nó địa chỉ xuất khẩu sang CSV. Tôi không có ý tưởng hoặc kinh nghiệm với cách UTL_FILE xử lý CLOBs, tuy nhiên.

+0

UTL_FILE có thể xử lý CLOB khá tốt, trong 9i và ngày lớn hơn, nó giống như xử lý một VARCHAR2. –

+0

Hmm, tôi không có quyền truy cập vào máy đó, nhưng có thể tôi sẽ dọa người nào đó nếu tôi không thể thực hiện trực tiếp. – geoffjentry

+0

UTL_FILE có thể chạy với tư cách người dùng, tôi tin. –

0

giả định bởi một kết xuất Oracle bạn có nghĩa là .dmp (hoặc từ xuất hoặc expdp), bạn đang xem tệp nhị phân. Bạn sẽ cần phải nhập tệp kết xuất vào cơ sở dữ liệu Oracle và sau đó xuất dữ liệu sang văn bản thuần túy bằng cách sử dụng UTL_FILE hoặc các phương tiện khác.

+0

Nó đã được tải vào một oracle db, nó chỉ là mục tiêu cuối cùng của tôi không phải là oracle, vì vậy tôi kéo ra các bit mà tôi muốn như CSV và đối phó với họ theo cách đó. Điều này đã được làm việc cho đến khi tôi chạy vào CLOBs – geoffjentry

0

Dưới đây là một kịch bản python nhưng nói chung ngắn mà chỉ này - bảng bán phá giá (với các lĩnh vực CLOB, trong số các phần còn lại) vào một tập tin csv phẳng: OraDump

2

Bạn có thể sử dụng một kịch bản Python để chăm sóc các xuất khẩu, CLOBs sẽ không bị cắt ngắn:

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

Các vấn đề liên quan