2009-09-16 82 views
13

Estoy usando Oracle SQL Developer e intentando exportar una tabla a un archivo CSV. Algunos de los campos son campos CLOB y, en muchos casos, las entradas se truncan cuando ocurre la exportación. Estoy buscando una manera de sacar todo esto, 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 voy a través de CSV como intermediario).Exportación de un CLOB a un archivo de texto usando Oracle SQL Developer

Si hay varias soluciones para esto, dado que es un procedimiento de una sola vez para mí, no me importa más las soluciones tipo hack-ish para las soluciones "do it right" más involucradas.

Respuesta

13

si tiene acceso al sistema de archivos del cuadro de base de datos que 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; 
/

Qué He copiado y pegado from this site.

También puede encontrar este previous question about UTL_FILE útil. Se trata de exportar a CSV. Sin embargo, no tengo ni idea ni experiencia sobre cómo UTL_FILE maneja los CLOB.

+0

UTL_FILE puede manejar CLOB bastante bien, en el día 9i y mayores, es igual que el manejo de un VARCHAR2. –

+0

Hmm, no tengo acceso a esa máquina, pero probablemente pueda asustar a alguien que lo haga si no puedo hacerlo directamente. – geoffjentry

+0

UTL_FILE se puede ejecutar como usuario, creo. –

0

asumiendo por un volcado de Oracle que quería decir un .dmp (ya sea de exportación o expdp), está buscando un archivo binario. Tendrá que importar el archivo de volcado en una base de datos Oracle y luego exportar los datos a texto plano usando UTL_FILE u otros medios.

+0

Ya está cargado en un oráculo db, es solo que mi objetivo final no es el oráculo, así que estoy sacando los bits que quiero como CSV y tratando con ellos de esa manera. Esto ha estado funcionando hasta que me encontré con los CLOB – geoffjentry

0

Aquí es un script en Python, sin embargo, en general corta que hace precisamente esto - mesas de dumping (con campos CLOB, entre el resto) en un archivo csv plana: OraDump

2

Se puede utilizar una secuencia de comandos de Python para hacerse cargo de la exportación, los CLOBs no conseguirán truncada:

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

Cuestiones relacionadas