Exportar un CLOB a un archivo de texto usando Oracle SQL Developer
-
07-07-2019 - |
Pregunta
Estoy usando Oracle SQL Developer e intento exportar una tabla a un archivo CSV. Algunos de los campos son campos CLOB y, en muchos casos, las entradas se truncan cuando se produce la exportación. Estoy buscando una manera de sacar todo, ya que mi objetivo final es no usar Oracle aquí (recibí un volcado de Oracle, que se cargó en un oráculo db, pero estoy usando los datos en otro formato, así que a través de CSV como intermediario).
Si hay varias soluciones para esto, dado que es un procedimiento único para mí, no me importan las soluciones de tipo hack-ish para los más involucrados '' hazlo bien ''; soluciones.
Solución
si tiene acceso al sistema de archivos en su cuadro de base de datos, podría hacer algo como esto:
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;
/
Lo que copié y pegué de este sitio .
También puede encontrar esta pregunta anterior sobre UTL_FILE útil. Aborda la exportación a CSV. Sin embargo, no tengo ni idea ni experiencia sobre cómo UTL_FILE maneja los CLOB.
Otros consejos
Puede usar un script Python para encargarse de la exportación, los CLOB no se truncará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
suponiendo que por un volcado de Oracle se refería a un .dmp (ya sea de exportación o expdp), está viendo un archivo binario. Deberá importar el archivo de volcado a una base de datos Oracle y luego exportar los datos a texto sin formato utilizando UTL_FILE u otros medios.
Aquí hay una secuencia de comandos de Python corta pero general que hace exactamente esto: volcar tablas (con campos CLOB, entre el resto) en un archivo csv plano: OraDump
Como Oracle SQL Developer se menciona explícitamente y "soluciones de tipo hack-ish" fueron alentados (y en caso de que alguien todavía lo necesite & # 8230;):
Si se ejecuta una sola declaración desde una hoja de trabajo SQL (en Oracle SQL Developer), el resultado se muestra como una tabla. Después de hacer clic en la tabla de resultados, use los métodos abreviados de teclado o el menú Editar para marcar primero toda la tabla y luego copiar su contenido. Continúe con el editor de texto de su elección. Pegar. Guardar en un archivo. Con suerte hecho. ;-)
Funciona incluso para CLOB que superen los 4000 caracteres. Si realmente ayuda o no, dependerá en gran medida del contenido real de los CLOB. A veces, un preprocesamiento de SQL puede llevarlo allí & # 8230;
Alternativamente, intente en el menú local de la tabla de resultados Exportar & # 8230; . Ir desde allí a través de la opción de formato Excel 95-2003 podría funcionar (mejor que CSV o texto / TSV).
Por favor comente, si esto requiere ajuste / más detalles.