2009-09-16 4 views
13

Я использую Oracle SQL Developer и пытаюсь экспортировать таблицу в файл CSV. Некоторые из полей являются полями CLOB, и во многих случаях записи усекаются при экспорте. Я ищу способ получить все это, так как моя конечная цель - не использовать Oracle здесь (я получил дамп Oracle, который был загружен в oracle db, но я использую данные в другом формате, поэтому CSV в качестве посредника).Экспорт CLOB в текстовый файл с использованием Oracle SQL Developer

Если для этого есть несколько решений, учитывая, что это одноразовая процедура для меня, я не возражаю против более сложных решений типа «хак-иш» для более эффективных решений «сделай это правильно».

ответ

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. –

+0

Хмм, у меня нет доступа к этой машине, но я, вероятно, могу напугать кого-то, кто это сделает, если я не смогу сделать это напрямую. – geoffjentry

+0

UTL_FILE может работать как пользователь, я верю. –

0

Предполагая, что с помощью дампа Oracle вы имели в виду .dmp (либо из экспорта, либо expdp), вы смотрите на двоичный файл. Вам нужно будет импортировать файл дампа в базу данных Oracle, а затем экспортировать данные в обычный текст с помощью UTL_FILE или другими способами.

+0

Он уже загружен в oracle db, просто моя конечная цель - не оракул, поэтому я вытаскиваю биты, которые я хочу, как CSV, и общаюсь с ними таким образом. Это работает до тех пор, пока я не наткнулся на CLOB – geoffjentry

0

Вот краткий пока общий сценарий питона, который делает именно это - демпинг таблицы (с CLOB полей, среди остальных) к плоскому CSV файл: OraDump

2

Вы можете использовать скрипт на Python, чтобы заботиться о экспорт, то CLOBs не обрезались:

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

Смежные вопросы