web-dev-qa-db-fra.com

Comment puis-je décharger des tables de base de données Oracle dans des fichiers csv?

J'ai besoin de récupérer certaines données d'une base de données Oracle 11g version 1 et de les fournir sous la forme d'un ou plusieurs fichiers CSV. Les données résident dans plusieurs tables et/ou vues. Tout cela devrait fonctionner via la ligne de commande. Quelle serait la meilleure approche à ce sujet?

18
aPhilRa

Arun,

maintenant que sqlcl est disponible sur Oracle SQL Developer 4.1 EA2 (4.1.0.18.37) vous pouvez l'utiliser un peu comme l'ancien et célèbre sqlplus. sqlcl a un paramètre de format de sortie pour csv

set sqlformat csv
spool x.csv
select * from yourtable[s];
spool off

pour plus d'informations sur la commande sqlcl blog de Kris

avant que sqlcl ne soit plus simple, il fallait utiliser APEX et exporter le rapport vers csv. Dans plain old sqlplus, vous pouvez le faire en utilisant

set lines 9999 -- the appropriate size
set head off  -- no header lines
set colsep ';' --column separator to ;
set pages 0 -- no pages
set feed off
select your data;
spool to_tofile
/
spool off

Cela fonctionne mieux si les résultats doivent être écrits sur un serveur d'applications ou un client. S'ils doivent être écrits sur le serveur de base de données, utl_file pourrait être une meilleure option.

Ronald.

11
ik_zelf

Vous devriez regarder le package intégré TL_FILE . Il existe plusieurs façons de l'utiliser.

  1. Vous pouvez écrire n'importe quel nombre de procédures dans des packages qui utilisent le package UTL_FILE pour écrire dans un nombre illimité de fichiers. Ces procédures peuvent ensuite être appelées à partir de presque toutes les applications, y compris SQL * Plus.

  2. Vous pouvez écrire un script PL/SQL pour effectuer le même travail et appeler le script à partir de la ligne de commande SQL * Plus elle-même en spécifiant @scriptname sur la ligne de commande.

  3. Vous pouvez coller un bloc en utilisant UTL_FILE directement dans SQL * Plus, mais cela ne devrait être utilisé que pour des exportations uniques et même alors ce n'est peut-être pas la meilleure route.

Dans leur forme la plus simple, une exportation de fichier utilisant UTL_FILE serait composée d'un appel à FOPEN , d'un ou plusieurs appels à PUT_LINE , et d'un appelez à FCLOSE .

8
Leigh Riffel

Si les performances sont un problème, vous voudrez peut-être envisager les outils des fournisseurs.

J'ai évalué des outils de BMC, Wisdomforce, CoSort, DBCrane. Ils sont tous beaucoup plus rapides que le spool, le fichier utl ou la table externe. Nous utilisons DBCrane parce que mon patron ne voulait pas dépenser trop pour la licence.

4
Lei

Vous pouvez utiliser Python et module cx_Oracle pour extraire les données sur disque au format CSV.

Voici comment vous connecter à Oracle à l'aide de cx_Oracle:

constr='scott/tiger@localhost:1521/ORCL12'
con = cx_Oracle.connect(constr)
cur = con.cursor()

Après la récupération des données, vous pouvez parcourir la liste Python et enregistrer les données au format CSV.

for i, chunk in enumerate(chunks(cur)):
    f_out.write('\n'.join([column_delimiter.join(row[0]) for row in chunk]))
    f_out.write('\n')

J'ai utilisé cette approche lorsque j'ai écrit TableHunter-For-Oracle

3
Alex Buzunov