2009-09-16 23 views
13

Używam programu Oracle SQL Developer i próbuję wyeksportować tabelę do pliku CSV. Niektóre pola są polami CLOB, aw wielu przypadkach wpisy są obcinane podczas eksportowania. Szukam sposobu, aby uzyskać całość, ponieważ moim celem końcowym jest nie używać Oracle tutaj (otrzymałem zrzut Oracle - który został załadowany do Oracle db, ale używam danych w innym formacie, więc przejście przez CSV jako pośrednik).Eksportowanie obiektu CLOB do pliku tekstowego przy użyciu Oracle SQL Developer

Jeśli istnieje wiele rozwiązań w tym zakresie, biorąc pod uwagę, że jest to jednorazowa procedura dla mnie, nie mam nic przeciwko bardziej hack-owemu rozwiązaniu bardziej zaangażowanych rozwiązań "zrób to dobrze".

Odpowiedz

13

jeśli masz dostęp do systemu plików na swoim polu bazy danych można zrobić coś takiego:

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

Które I skopiowana i wklejona from this site.

Możesz również znaleźć ten previous question about UTL_FILE przydatne. Jest adres eksportu do pliku CSV. Nie mam pojęcia ani doświadczenia z tym, jak UTL_FILE obsługuje obiekty CLOB.

+0

UTL_FILE poradzi CLOB całkiem dobrze, w 9i i większych dni, to tak jak dotknięciem VARCHAR2. –

+0

Hmm, nie mam dostępu do tej maszyny, ale prawdopodobnie mogę przestraszyć kogoś, kto robi, jeśli nie mogę tego zrobić bezpośrednio. – geoffjentry

+0

UTL_FILE może być uruchamiany jako użytkownik, jak sądzę. –

0

zakładając, że przez zrzut Oracle miałeś na myśli .dmp (albo z eksportu lub expdp), patrzysz na plik binarny. Musisz zaimportować plik dumpfile do bazy danych Oracle, a następnie wyeksportować dane do zwykłego tekstu za pomocą UTL_FILE lub w inny sposób.

+0

Jest już załadowany do db Oracle, po prostu moim celem końcowym nie jest wyrocznia, więc wyciągam bitów, które chcę jako CSV i radzenia sobie z nimi w ten sposób. To działało, dopóki nie wpadłem na CLOB – geoffjentry

0

Oto krótka jeszcze ogólny skrypt Pythona, który robi właśnie to - tabele dumpingu (z polami CLOB, wśród reszty) do płaskiej pliku csv: OraDump

2

można wykorzystać skrypt Pythona aby dbać o eksport, CLOB nie dostanie obcięty:

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