Exportando um CLOB para um arquivo de texto usando o Oracle SQL Developer
-
07-07-2019 - |
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.
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
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.