Exportation d'un fichier CLOB dans un fichier texte à l'aide d'Oracle SQL Developer
-
07-07-2019 - |
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.
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.