La question revient souvent sur les forums : comment produire un fichier csv depuis SQL*Plus …
Une solution a été donnée sur le forum Developpez.net, elle est copiée ici dans une version un peu remaniée et très légèrement plus générique
L’appel est simple depuis sqlplus: @sql2csv <nom du fichier contenant la(les) requête(s) à exporter en csv>
-- merci à skuatamad (http://www.developpez.net/forums/u253956/skuatamad/) -- -- 1 paramètre : le nom du script sql à exécuter -- En sortie un fichier CSV -- store set settings_sqlplus replace set echo off set feedback off set linesize 32767 set pages 0 emb on newp none set sqlprompt '' set trimspool on set long 9999999 set longc 9999999 set colsep ';' set heading on set recsep off set headsep on set underline off spool &&1..csv @&&1 spool off undef 1 @settings_sqlplus
Par exemple avec cette requête sql stockée dans le fichier sessions.sql :
select sid , serial# , process , sql_id , last_call_et , status from v$session ;
On obtient génère le fichier csv de la manière suivante:
SQL> @sessions SID SERIAL# PROCESS SQL_ID LAST_CALL_ET STATUS ---------- ---------- ------------ ------------- ------------ -------- 146 10 4312 4gd6b1r53yt88 60116 ACTIVE 151 2 4308 60116 ACTIVE 157 7 3836 60126 ACTIVE 159 46 6640:5200 g8730nuf9c1xf 0 ACTIVE 160 1 3796 60133 ACTIVE 161 1 3792 4gd6b1r53yt88 60133 ACTIVE 162 1 3788 60133 ACTIVE 163 1 3784 60133 ACTIVE 164 1 3780 60133 ACTIVE 165 1 3776 60133 ACTIVE 166 1 3772 60133 ACTIVE SID SERIAL# PROCESS SQL_ID LAST_CALL_ET STATUS ---------- ---------- ------------ ------------- ------------ -------- 167 1 3768 60133 ACTIVE 168 1 3764 60133 ACTIVE 169 1 3760 60133 ACTIVE 170 1 3756 60133 ACTIVE 15 rows selected. SQL> @sql2csv sessions Wrote file settings_sqlplus SID; SERIAL#;PROCESS ;SQL_ID ;LAST_CALL_ET;STATUS 146; 10;4312 ;4gd6b1r53yt88; 60140;ACTIVE 151; 2;4308 ; ; 60140;ACTIVE 157; 7;3836 ; ; 60150;ACTIVE 159; 46;6640:5200 ;g8730nuf9c1xf; 0;ACTIVE 160; 1;3796 ; ; 60157;ACTIVE 161; 1;3792 ;4gd6b1r53yt88; 60157;ACTIVE 162; 1;3788 ; ; 60157;ACTIVE 163; 1;3784 ; ; 60157;ACTIVE 164; 1;3780 ; ; 60157;ACTIVE 165; 1;3776 ; ; 60157;ACTIVE 166; 1;3772 ; ; 60157;ACTIVE 167; 1;3768 ; ; 60157;ACTIVE 168; 1;3764 ; ; 60157;ACTIVE 169; 1;3760 ; ; 60157;ACTIVE 170; 1;3756 ; ; 60157;ACTIVE SQL> ho type sessions.csv SID; SERIAL#;PROCESS ;SQL_ID ;LAST_CALL_ET;STATUS 146; 10;4312 ;4gd6b1r53yt88; 60140;ACTIVE 151; 2;4308 ; ; 60140;ACTIVE 157; 7;3836 ; ; 60150;ACTIVE 159; 46;6640:5200 ;g8730nuf9c1xf; 0;ACTIVE 160; 1;3796 ; ; 60157;ACTIVE 161; 1;3792 ;4gd6b1r53yt88; 60157;ACTIVE 162; 1;3788 ; ; 60157;ACTIVE 163; 1;3784 ; ; 60157;ACTIVE 164; 1;3780 ; ; 60157;ACTIVE 165; 1;3776 ; ; 60157;ACTIVE 166; 1;3772 ; ; 60157;ACTIVE 167; 1;3768 ; ; 60157;ACTIVE 168; 1;3764 ; ; 60157;ACTIVE 169; 1;3760 ; ; 60157;ACTIVE 170; 1;3756 ; ; 60157;ACTIVE
Convenons-en c’est dune laideur absolue même si dans bien des cas ça suffit.
La version 12 apporte à sqlplus l’option CSV à “SET MARKUP” qui a pour effet de créer un fichier CSV normalisé
set markup csv on delim ";" select OWNER,TABLE_NAME,TABLESPACE_NAME,STATUS,LAST_ANALYZED from all_tables where rownum < 11 ; "OWNER";"TABLE_NAME";"TABLESPACE_NAME";"STATUS";"LAST_ANALYZED" "SYS";"DUAL";"SYSTEM";"VALID";"24-FEB-21" "SYS";"SYSTEM_PRIVILEGE_MAP";"SYSTEM";"VALID";"24-JAN-21" "SYS";"TABLE_PRIVILEGE_MAP";"SYSTEM";"VALID";"24-JAN-21" "SYS";"USER_PRIVILEGE_MAP";"SYSTEM";"VALID";"24-JAN-21" "SYS";"STMT_AUDIT_OPTION_MAP";"SYSTEM";"VALID";"24-JAN-21" "SYS";"AV_DUAL";"SYSTEM";"VALID";"24-JAN-21" "SYS";"WRR$_REPLAY_CALL_FILTER";"SYSAUX";"VALID";"24-JAN-21" "SYS";"SCHEDULER_FILEWATCHER_QT";"SYSTEM";"VALID"; "SYS";"HS_BULKLOAD_VIEW_OBJ";"SYSTEM";"VALID";"24-JAN-21" "SYS";"HS$_PARALLEL_METADATA";"SYSTEM";"VALID";"24-JAN-21" 10 rows selected.
Mieux non ?