Export requete oracle en CSV via la ligne de commande

Export requete oracle en CSV via la ligne de commande - SQL/NoSQL - Programmation

Marsh Posté le 26-11-2008 à 10:55:40    

Bonjour,
 
Je dispose de requetes sql sour oracle que je souhaiterais executer automatiquement de nuit afin de generer un fichier csv du resultat.
 
Apres quelques recherches sur le net, je n'ai pas trouve de methode simple pour faire cela.
 
Actuellement j'arrive a generer un fichier via sqlplus mais le resultat n'est pas en csv et je ne sais pas comment le modifier.
 
Je suppose qu'il existe des outils standards pour faire ca mais je ne trouve rien de rien.
 
Si vous en connaissez un interessant.
 
Merci d'avance
 
v.

Reply

Marsh Posté le 26-11-2008 à 10:55:40   

Reply

Marsh Posté le 26-11-2008 à 11:06:22    

c'est quoi une méthode simple pour toi ?
En sqlplus tu peux le faire en jouant avec les options de formattage ("set head", "set linesize", etc.)
Tu peux également le faire en PL/SQL et en utilisant UTL_FILE (inconvénient : il faut déclarer les répertoires autorisés dans le fichier init)
Moi perso je préfère le faire avec des langages plus évolués style Perl

Reply

Marsh Posté le 26-11-2008 à 11:24:36    

ben le probleme est la.
J'aurais aime avoir un petit soft qui fasse ca tout seul :
- on lui passe les infos de connexion
- on lui passe la requete
- il genere un fichier csv
 
le tout via un fichier de parametrage ou la ligne de commande.
 
Si ca n'existe pas, je vais le faire, ca m'embetait juste de reinventer la roue.
 
Par contre, je ne connais pas les options de formatage de sqlplus. Je vais donc creuser dans ce sens.
 
Merci pour l'info

Reply

Marsh Posté le 26-11-2008 à 11:37:41    

Ok, j'ai regarde les options de formatage de sqlplus et j'arrive a un resultat presque ok.
Sauriez-vous comment on peut supprimer la ligne de '------------' entre le nom des colonnes et les donnees tout en gardant le nom des colonnes affiche ?
 
Merci d'avance
 
v.

Reply

Marsh Posté le 26-11-2008 à 12:16:08    

j'ai fais un truc en java pour un collègue qui avait besoin de ca, mp moi ton mail et je te l'envoie

Reply

Marsh Posté le 26-11-2008 à 13:17:01    

vonm a écrit :

Ok, j'ai regarde les options de formatage de sqlplus et j'arrive a un resultat presque ok.
Sauriez-vous comment on peut supprimer la ligne de '------------' entre le nom des colonnes et les donnees tout en gardant le nom des colonnes affiche ?
 
Merci d'avance
 
v.


enfin une vraie question...
la réponse :

Code :
  1. set pagesize 0

Reply

Marsh Posté le 26-11-2008 à 13:18:34    

casimimir a écrit :

j'ai fais un truc en java pour un collègue qui avait besoin de ca, mp moi ton mail et je te l'envoie


c'est un peu lourd pour si peu de choses :/
ca se fait en qques lignes sous sqlplus ou pl/sql

Reply

Marsh Posté le 26-11-2008 à 13:26:48    

Je confirme que cela se fait couramment avec sqlplus. Mais comme ça s'apprend rarement dans les écoles d'informatique, je vois beaucoup de jeunes informaticiens qui sont un peu perplexes, alors que c'est assez simple une fois que l'on connait les commandes pour ne pas avoir les lignes non désirées de sqlplus. Voir la doc de sqlplus.

Reply

Marsh Posté le 26-11-2008 à 13:47:12    

couak a écrit :


enfin une vraie question...
la réponse :

Code :
  1. set pagesize 0



 
certes, mais je me permets de la reposer car ta reponse semble ne pas fonctionner :
 
Sauriez-vous comment on peut supprimer la ligne de '------------' entre le nom des colonnes et les donnees tout en gardant le nom des colonnes affiche ?  
 
merci
 
v.

Reply

Marsh Posté le 26-11-2008 à 13:48:58    

olivthill a écrit :

Je confirme que cela se fait couramment avec sqlplus. Mais comme ça s'apprend rarement dans les écoles d'informatique, je vois beaucoup de jeunes informaticiens qui sont un peu perplexes, alors que c'est assez simple une fois que l'on connait les commandes pour ne pas avoir les lignes non désirées de sqlplus. Voir la doc de sqlplus.


 
Merci beaucoup pour le "jeunes informaticien", mais tu sais je ne suis plus tout frais !!!  :)  
 
Personnellement, j'ai un vrai probleme avec Oracle que je n'utilise que tres rarement et qui me parait d'un abord terriblement complexe.
 
Et sur ce point la doc de sqlplus (que j'ai lu avant de poster ici) ne m'aide que bien peu.
 
v.

Reply

Marsh Posté le 26-11-2008 à 13:48:58   

Reply

Marsh Posté le 26-11-2008 à 13:50:06    

SET HEADING OFF
 
(et il y a d'autres options intéressantes, voir la doc (ne jamais oublier que Google est ton ami, alors qu'il n'y a que des grincheux sur les forums)).

Reply

Marsh Posté le 26-11-2008 à 13:51:26    

Je me rends compte que je n'apporte pas assez de detail sur mon probleme.
 
Voici le script que j'utilise :

Code :
  1. SET echo off
  2. SET termout off
  3. SET feedback off
  4. SET head ON
  5. SET pages 50000
  6. SET LINES 5000
  7. SET pagesize 50000
  8. SET pause off
  9. SET colsep ';'
  10. Spool C:\fichier.csv
  11. SELECT * from t_client where nom = 'TOTO';
  12. spool off
  13. exit


 
Je souhaiterais obtenir un fichier csv tout ce qu'il y a de plus classique :
NOM;PRENOM;ADRESSE...
TOTO;Tutu;25 rue des mesanges...
 
Merci d'avance pour toute l'aide que vous voudrez bien m'apporter.
 
v.
 
PS: set heading off masque le nom des champs. Moi je les veux mais sans les --------- qui me polluent l'affichage.


Message édité par vonm le 26-11-2008 à 13:53:48
Reply

Marsh Posté le 26-11-2008 à 14:06:59    

"SET pages 50000" et "SET pagesize 50000" sont identiques car sqlplus accepte un racourcisement du nom de l'option quand il n'y a pas d'ambiguité possible.
Les tirets sont présents à cause de la ligne "SET head ON". Il faudrait mettre "SET Heading OFF" à la place.
Edit : On ne peut pas enlever uniquement les tirets. Pour y remédier on peut les enlever à la fin avec un grep -v ou bien les ajouter avec cat sous Unix.


Message édité par olivthill le 26-11-2008 à 14:10:04
Reply

Marsh Posté le 26-11-2008 à 14:08:28    

couak a écrit :


c'est un peu lourd pour si peu de choses :/
ca se fait en qques lignes sous sqlplus ou pl/sql


 
un peu lourd? faut un peu évaluer ce qu'on appelle lourd -> entre installer un oracle client lourd a crever et une jvm installée maintenant sur tous les systèmes tu choisis quoi?
 
he oui parceque installer sqlplus cela veut dire installer l'oracle client et si c'est juste pour rapatrier des données franchement on a plus la même notion de lourd.
la mon .jar fait 7kb + 2mo de lib( opencsv et le jdbc oracle).
 
j'utilise sqlplus pour pleins de trucs, mais pour un extract de donnée pil/poil dans le format nécessaire + qques opérations annexes c'est du bidouillage et des rustines dans tous les sens.

Reply

Marsh Posté le 26-11-2008 à 14:25:39    

lourd dans le sens utiliser java pour faire du scripting, après c'es le mode, c'est le langage du futur, etc. oui sûrement mais c'est surtout un langage pour faire du gros développement et moins bien adapté que d'autres boîte à outils comme perl ou les outils natifs
 
le client oracle est installé par défaut sur le serveur, donc je ne vois pas où est le soucis si le batch doit tourner toutes les nuits... j'installerais le script naturellement sur le serveur oracle
 
sous unix, perl est très souvent présent avec ce qu'il faut, un coup de DBD + le client léger et ca roule
 
sous windows, perl est installé par défaut avec une install serveur d'oracle, avec toutes les libs
 
donc oui je trouve ca lourd, perso je préfère pondre 20 lignes de pl/sql ou 20 lignes de perl car je sais que ce sont des outils qui sont plus souvent présent que le java, bien que ca soit de moins en moins vrai... la preuve oracle intègre une JVM embarqué et il est possible de faire des batches en java...

Reply

Marsh Posté le 26-11-2008 à 15:19:51    

c'est optimiste de penser qu'on a tout le temps accès au serveur.
 
après que ce soit du perl ou du java ou du cobol ça n'a pas d'importance, c'est juste que ne pas passer par une install du client oracle ça me parait pas débile pour juste rapatrier qques données.

Reply

Marsh Posté le 26-11-2008 à 15:53:54    

je te retourne la question : il te parlait de sqlplus donc ca voulait dire qu'il avait déjà le client, alors ne pas passer par une install d'un JRE pour rapatrier qques données ca me parait pas débile :)

Reply

Marsh Posté le 26-11-2008 à 16:04:20    

pour revenir au problème :
si le paramètre UTL_FILE a été activé (mais j'en doute) tu peux faire un bout de code en pl/sql :

Code :
  1. BEGIN
  2. DECLARE
  3.   OutputFile UTL_FILE.FILE_TYPE;
  4.   CURSOR C_maTable IS
  5.   SELECT * FROM maTable ;
  6.   BEGIN
  7.     OutputFile := UTL_FILE.FOPEN('C:\Temp','output.csv','w');
  8.     FOR CurIn IN C_maTable
  9.       UTL_FILE.PUT_LINE(OutputFile,
  10.         CurIn.champ1 || ';' ||
  11. CurIn.champ2 || ';'
  12.       );
  13.     END LOOP;
  14.     UTL_FILE.FCLOSE(OutputFile);
  15.     EXCEPTION WHEN utl_file.invalid_path THEN
  16.       RAISE_APPLICATION_ERROR(-20000, 'Erreur lors de l''écriture du fichier');
  17.   END;
  18. END;
  19. /

Reply

Marsh Posté le 26-11-2008 à 17:19:00    

c'est vrai :)
 
enfin la c'est juste aussi que j'avais un .jar qui fait tiptop tout pret qui faisait tiptop ce qu'il voulait, un .sql, un fichier de connexion et zou

Reply

Marsh Posté le 26-11-2008 à 18:31:34    

exact et je t'en remercie !
 
A ce sujet, je n'arrive pas a le faire tourner car il manque une librairie.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at application.GenerateCsvFromSql.<clinit>(GenerateCsvFromSql.java:24)
 
Il faut que je rajoute le jar de Log4j dans un classpath quelconque ???
 
v.

Reply

Marsh Posté le 27-11-2008 à 10:40:31    

sorry, j'aurai du t'envoyer les libs je le fais now

Reply

Marsh Posté le 27-11-2008 à 11:06:32    

Ca fonctionne nickel.
 
Merci beaucoup
 
v.

Reply

Marsh Posté le 11-07-2012 à 02:17:08    

vonm a écrit :

Ca fonctionne nickel.
 
Merci beaucoup
 
v.


bonjour est ce que je peux avoir votre programme  :??:

Reply

Marsh Posté le 16-07-2012 à 12:25:31    

sallaf a écrit :


bonjour est ce que je peux avoir votre programme  :??:


 
houlaaaa...
Desole mais franchement, je n'ai plus rien sous la main.
 
Si tu demandes en mp a casimimir il a peut etre encore ca sous la main.
 
v.

Reply

Marsh Posté le 28-06-2013 à 12:26:49    

. "<br />\n"

Reply

Marsh Posté le 28-06-2013 à 12:28:47    

Bonjour,  
 
 
Je cherche à manipuler le contenu d'un fichier csv dans un tableau.  
J'utilise pour cela la fonciton fgetcsv(fichier, taille, separateur) qui me  
renvoie tout le fichier ligne par ligne (avec un while).  
 
Je voudrais pouvoir manipuler ce tableau par ligne et par colonnes. J'arrive  
facilement à isloer une colonne, mais comment faire pour isloer une ligne ?  
bref on utulisant script (php) pour vider tout les ligne d'une colone choisie ?aidez -moi stp.;.;.;voila le code source qui j'utulise pour manipuler le contenu du fichier dans un tableau:  
 
 
<?php  
 
$row = 1;  
if (($handle = fopen("fichier.csv", "r" )) !== FALSE) {  
 
echo '<center> <table border="1" > ';  
 
while (($data = fgetcsv($handle, 1000, "," )) !== FALSE) {  
$num = count($data);  
if ($row == 1) {  
 
echo '<thead align="center" ><tr>';  
}else{  
echo '<tr>';  
}  
 
for ($c=0; $c < $num; $c++) {  
//echo $data[$c] . "<br />\n";  
if(empty($data[$c])) {  
 
 
 
 
$value = " ";  
}else{  
$value = $data[$c];  
}  
if ($row == 1) {  
echo '<th>'.$value.'</th>';  
}else{  
echo '<td>'.$value.'</td>';  
}  
}  
 
if ($row ==1) {  
echo '</tr></thead><tbody>';  
}else{  
echo '</tr>';  
}  
$row++;  
}  
 
echo '</tbody></table></center>';  
fclose($handle);  
}  
?>

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed