2015-07-26 19 views
8

Bir CSV dosyasına büyük CLOB'lar içeren bir sorgu sonucu vermek istiyorum. Ancak, CSV fiels'leri ihraç edildikten sonra, CLOB'lar yaklaşık 4K karakterden sonra kesilir (diğer bir deyişle, "…" ile bitmeden sona erer). Oracle SQL Developer'ın dışa aktarmadaki CLOB'ları kesmesini nasıl önleyebiliriz?Oracle SQL Developer'ın dışa aktarma sırasında CLOB'ları kesmesini engelle

enter image description here

+0

@sstan sayesinde, bu ihracat için Oracle SQL Developer kullanmayı gerektirir işaret soru, benimkinden farklı. –

+0

Yorum için teşekkürler. Kabul. – sstan

+0

> 4k clobs dosyasını dışa aktarmak için SQL Developer'ı kullanabileceğinizi düşünmüyorum. Jeff Smith http://stackoverflow.com/users/1156452/thatjeffsmith SQL Developer için ürün yöneticisidir, böylece kesin bir cevap verebilecektir. Güzel Python script BTW. –

cevap

1

SQL Geliştirici Sürüm 4.1.3.20 kullanarak kullanarak ve aynı sorunu var ediyorum. Benim için çalışan tek şey, dışa aktarma formatı olarak XML'i seçmekti. Bunu yaparken, ~ 135.000 karakter JSON dizgisini kesmeye gerek kalmadan ihraç edebildim.

İkinci sorun, ancak verildikten hemen sonra veri alma girişiminde bulundu ve SQL Developer, "null" hatası nedeniyle dosyayı açamadıklarını söyledi.

+0

bu da benim için çok uzun 100000 ayarlandığında çalışır; longchunksize set 100000; '' 'ancak onları başka bir tabloya aktaramıyorum sadece" null "yazıyor ve kırılıyor –

2

İhracat için Oracle SQL Developer'ı atlayabilirsiniz; Eğer CLOBs kısaltılmaması böylece ihracat bakacak bir Python komut dosyası kullanabilirsiniz kullanabilirsiniz:

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 
İlgili konular