2015-07-26 23 views
8

Desidero esportare un risultato di query che contiene CLOB di grandi dimensioni in un file CSV. Tuttavia, una volta esportati nei campi CSV, i CLOB vengono troncati dopo circa 4K caratteri (ad esempio, terminano prematuramente con "..."). Come impedire a Oracle SQL Developer di troncare i CLOB all'esportazione?Impedire a Oracle SQL Developer di troncare i CLOB all'esportazione

enter image description here

+0

@sstan Grazie, la domanda che indicò cosa richiede di utilizzare Oracle SQL Developer per l'esportazione, a differenza del mio. –

+0

Grazie per il commento. Concordato. – sstan

+0

Non penso che tu possa usare SQL Developer per esportare> 4k clob. Jeff Smith http://stackoverflow.com/users/1156452/thatjeffsmith è il product manager per SQL Developer, quindi sarà in grado di fornire la risposta definitiva. Bello script Python BTW. –

risposta

1

sto usando utilizzando SQL Developer versione 4.1.3.20 e hanno lo stesso problema. L'unica cosa che ha funzionato per me era selezionare XML come formato di esportazione. Facendo questo, sono stato in grado di esportare una stringa JSON di ~ 135.000 caratteri senza troncamenti.

Il secondo problema, tuttavia, è subito dopo l'esportazione. Ho tentato di importare i dati e SQL Developer ha affermato che non è possibile aprire il file a causa dell'errore "null".

+0

questo funziona anche per me quando si imposta '' 'set long 100000; imposta longchunksize 100000; '' 'ma non riesco a importarli su un'altra tabella, dice solo" null "e si interrompe –

2

È possibile aggirare Oracle SQL Developer per l'esportazione, ad es. è possibile utilizzare utilizzare uno script Python per prendersi cura delle esportazioni in modo che i CLOB non otterrà troncata:

from __future__ import print_function 
from __future__ import division 

import time 
import cx_Oracle 

def get_cursor(): 
    ''' 
    Get a cursor to the database 
    ''' 
    # http://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 = oracle_db.get_cursor() 
    sql_filename = 'your_query.sql' # Write your query there 
    cursor = oracle_db.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