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.

¿Fue útil?

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

FYI: Ayuda para instalar cx_Oracle

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top