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
risposta
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".
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 –
È 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
@sstan Grazie, la domanda che indicò cosa richiede di utilizzare Oracle SQL Developer per l'esportazione, a differenza del mio. –
Grazie per il commento. Concordato. – sstan
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. –