sql2csv ou comment générer un fichier csv depuis SQL*PLUS

La question revient souvent sur les forums : comment produire un fichier csv depuis SQL*Plus

La 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