Domanda

Sto utilizzando Oracle SQL Developer e sto cercando di esportare una tabella in un file CSV. Alcuni dei campi sono campi CLOB e in molti casi le voci vengono troncate quando si verifica l'esportazione. Sto cercando un modo per ottenere il tutto, poiché il mio obiettivo finale è di non usare Oracle qui (ho ricevuto un dump Oracle - che è stato caricato in un db Oracle, ma sto usando i dati in un altro formato quindi passando attraverso CSV come intermediario).

Se ci sono più soluzioni a questo, dato che è una procedura una tantum per me, non mi dispiace più soluzioni di tipo hack-ish per più coinvolti "fallo bene" soluzioni.

È stato utile?

Soluzione

se hai accesso al file system sulla tua casella di database potresti fare qualcosa del genere:

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;
/

Che ho copiato e incollato da questo sito .

Puoi anche trovare questa domanda precedente su UTL_FILE utile. Si rivolge all'esportazione in CSV. Tuttavia, non ho idea o esperienza su come UTL_FILE gestisce i CLOB.

Altri suggerimenti

Puoi usare uno script Python per occuparti dell'esportazione, i CLOB non verranno troncati:

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: Aiuto per l'installazione di cx_Oracle

supponendo che un dump Oracle intendesse un .dmp (sia da export che da expdp), stai guardando un file binario. Dovrai importare il dumpfile in un database Oracle e quindi esportare i dati in testo semplice usando UTL_FILE o altri mezzi.

Ecco uno script python breve ma generale che fa proprio questo: scaricare le tabelle (con i campi CLOB, tra gli altri) in un file CSV piatto: OraDump

Come Oracle SQL Developer viene esplicitamente menzionato e "quotato soluzioni di tipo hack" e quot; sono stati incoraggiati (e nel caso qualcuno abbia ancora bisogno ...):

Se una singola istruzione viene eseguita da un foglio di lavoro SQL (in Oracle SQL Developer), il risultato viene visualizzato come una tabella. Dopo aver fatto clic sulla tabella dei risultati, utilizzare le scorciatoie da tastiera o il menu Modifica per contrassegnare prima l'intera tabella e quindi copiarne il contenuto. Passa al tuo editor di testo preferito. Incolla. Salva in un file. Speriamo di averlo fatto. ; -)

Funziona anche con CLOB di oltre 4000 caratteri. Se effettivamente aiuta, dipenderà molto dal contenuto reale dei CLOB. A volte alcune pre-elaborazioni SQL potrebbero portarti lì ...

In alternativa, prova nel menu locale della tabella dei risultati Esporta ... . Passare da lì tramite l'opzione di formato Excel 95-2003 potrebbe funzionare (meglio di CSV o testo / TSV).

Si prega di commentare se e in quanto ciò richiede aggiustamenti / ulteriori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top