Pergunta

Eu estou usando o Oracle SQL Developer e tentando exportar uma tabela para um arquivo CSV. Alguns dos campos são campos CLOB, e em muitos casos as entradas são truncados quando a exportação acontece. Eu estou procurando uma maneira de obter a coisa toda, como o meu objetivo final é não usar o Oracle aqui (I recebeu um despejo da Oracle - que foi carregado em um db oracle, mas estou usando os dados em outro formato assim que ir via CSV como um intermediário).

Se existirem várias soluções para este, uma vez que é um procedimento um tempo para mim, eu não me importo os mais soluções tipo de hack-ish a mais envolvida "fazer direito" soluções.

Foi útil?

Solução

Se você tem acesso ao sistema de arquivos em sua caixa de banco de dados que você poderia fazer algo como isto:

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

O que eu copiado e colado deste site .

Você também pode encontrar este pergunta anterior sobre UTL_FILE útil. Ele aborda a exportação para CSV. Eu não tenho nenhuma ideia ou experiência com a forma como UTL_FILE alças CLOBs, no entanto.

Outras dicas

Você pode usar um script Python para cuidar da exportação, os CLOBs não vai ficar truncado:

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: ajuda para instalar cx_Oracle

assumindo por um despejo Oracle você significou um DMP (a partir de exportação ou expdp), você está olhando para um arquivo binário. Você precisará importar o arquivo de despejo em um banco de dados Oracle e, em seguida, exportar os dados em texto simples utilizando UTL_FILE ou outros meios.

Aqui está um script python ainda curta geral que faz exatamente isso - tabelas de dumping (com campos CLOB, entre o resto) para um arquivo CSV plana: OraDump

Como Oracle SQL Developer é explicitamente mencionada e "soluções tipo de hack-ish" foram incentivados (e no caso de alguém ainda está em necessidade ...):

Se uma única instrução é executada a partir de uma Planilha SQL (em Oracle SQL Developer), o resultado é exibido como uma tabela. Depois de clicar tabela de resultados, utilize um atalhos de teclado ou o Editar menu para primeira marca a tabela inteira e, em seguida, para copiar seu conteúdo. Avance para o seu editor de texto de escolha. Colar. Salvar em um arquivo. Esperemos feito. ; -)

Funciona mesmo para CLOBs superior a 4000 caracteres. Se é ou não realmente ajuda, vai depender muito conteúdo real dos CLOBs. Às vezes, alguns pré-processamento SQL pode chegar lá ...

Como alternativa, experimente no local menu da tabela de resultados Export ... . Indo de lá através do Excel 95-2003 trabalho formato opção de poder (melhor do que CSV ou texto / TSV).

Por favor, comente, se e como este requer ajuste / mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top