2009-09-16 7 views
13

J'utilise Oracle SQL Developer et j'essaie d'exporter une table vers un fichier CSV. Certains des champs sont des champs CLOB, et dans de nombreux cas, les entrées sont tronquées lors de l'exportation. Je cherche un moyen de sortir le tout, car mon objectif final est de ne pas utiliser Oracle ici (j'ai reçu un vidage Oracle - qui a été chargé dans un db oracle, mais j'utilise les données dans un autre format en passant par CSV en tant qu'intermédiaire).Exportation d'une CLOB dans un fichier texte à l'aide d'Oracle SQL Developer

S'il y a plusieurs solutions à cela, étant donné qu'il s'agit d'une procédure ponctuelle pour moi, cela ne me dérange pas les solutions de type hack-ish pour les solutions «fais-le bien».

Répondre

13

si vous avez accès au système de fichiers sur votre boîte de base de données que vous pourriez faire quelque chose comme ceci:

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

Ce que je copié et collé from this site. Vous pouvez également trouver cette previous question about UTL_FILE utile. Il traite de l'exportation au format CSV. Cependant, je n'ai aucune idée ou expérience de la façon dont UTL_FILE gère les CLOB.

+0

UTL_FILE peut gérer CLOB assez bien, dans les jours 9i et plus, il est tout comme la manipulation d'un VARCHAR2. –

+0

Hmm, je n'ai pas accès à cette machine, mais je peux probablement effrayer quelqu'un qui le fait si je ne peux pas le faire directement. – geoffjentry

+0

UTL_FILE peut être exécuté en tant qu'utilisateur, je crois. –

0

En supposant que vous utilisiez un vidage Oracle pour désigner un fichier .dmp (export ou expdp), vous recherchez un fichier binaire. Vous devez importer le fichier dump dans une base de données Oracle, puis exporter les données en texte brut à l'aide de UTL_FILE ou d'autres moyens.

+0

Il est déjà chargé dans un oracle db, c'est juste que mon but final n'est pas oracle, donc je suis en train de sortir les bits que je veux comme CSV et de les traiter de cette façon. Cela a fonctionné jusqu'à ce que je suis tombé sur les CLOBs – geoffjentry

0

Voici un script python court encore général qui fait juste cette - tables de dumping (avec des champs CLOB, parmi les autres) à un fichier csv plat: OraDump

2

Vous pouvez utiliser un script Python pour prendre soin de la l'exportation, les CLOBs ne se tronquée:

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 

Pour votre information: Help installing cx_Oracle

Questions connexes