Question

J'utilise Oracle SQL Developer et j'essaie d'exporter une table dans 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 tout extraire, car mon objectif final est de ne pas utiliser Oracle ici (j'ai reçu un dump Oracle - qui a été chargé dans une base de données oracle, mais j'utilise les données dans un autre format afin de passer par CSV en tant qu’intermédiaire).

S'il existe plusieurs solutions à ce problème, étant donné qu'il s'agit d'une procédure unique, les solutions de type plus bidirectionnel plus compliquées ne me dérangent pas. "faites-le correctement" solutions.

Était-ce utile?

La solution

si vous avez accès au système de fichiers de votre boîte de base de données, vous pouvez procéder comme suit:

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 j'ai copié et collé depuis ce site .

Vous pouvez également trouver cette question précédente sur UTL_FILE utile. Il s’agit d’exporter au format CSV. Je n'ai aucune idée ou expérience de la façon dont UTL_FILE gère les CLOBs, cependant.

Autres conseils

Vous pouvez utiliser un script Python pour gérer l'exportation, les objets CLOB ne seront pas tronqués:

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 info: Aide pour l'installation de cx_Oracle

En supposant que par un vidage Oracle, vous vouliez dire un fichier .dmp (provenant de export ou expdp), vous envisagez un fichier binaire. Vous devez importer le fichier de vidage dans une base de données Oracle, puis exporter les données en texte brut à l'aide de UTL_FILE ou d'un autre moyen.

Voici un script python court mais général qui ne fait que cela - des tables de dumping (avec des champs CLOB, entre autres) dans un fichier csv non hiérarchique: OraDump

Oracle SQL Developer étant explicitement mentionné et "solutions de type hack-ish" ont été encouragés (et au cas où une personne aurait encore besoin de & # 8230;):

Si une seule instruction est exécutée à partir d'une feuille de calcul SQL (dans Oracle SQL Developer), le résultat est affiché sous forme de tableau. Après avoir cliqué sur le tableau de résultats, utilisez les raccourcis clavier ou le menu Modifier pour marquer tout le tableau, puis pour en copier le contenu. Passez à l'éditeur de texte de votre choix. Coller. Enregistrer dans un fichier. J'espère que c'est fait. ; -)

Fonctionne même pour les CLOB de plus de 4000 caractères. Que cela aide ou non, cela dépendra beaucoup du contenu réel des CLOBs. Un prétraitement SQL peut parfois vous y amener & # 8230;

Vous pouvez également essayer le menu local Exporter & # 8230; du tableau des résultats. Passer par là à travers l'option de formatage Excel 95-2003 pourrait fonctionner (mieux que CSV ou text / TSV).

Veuillez commenter, si et comme cela nécessite des ajustements / des détails supplémentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top