création d’un fichier CSV en SQL brut

voici les base pour créer un fichier CSV depuis un script SQL

SET PAGES 9999
SET LINE  1000
REM on n'affiche pas les titres de colonnes et l’entête de page
SET HEADING OFF
REM on n'affiche aucun text
SET ECHO OFF
SET FEEDBACK OFF
SET UNDERLINE OFF
SET HEADSEP OFF
REM on ne renvoi rien au terminal
SET TERMOUT OFF
REM choix du séparateur
SET COLSEP ';'
REM on retire les espace de fin de ligne du fichier SPOOL
SET TRIMS ON
 
Col DATEJOUR new_value DATEJOUR;
SELECT To_Char(SysDate, 'YYYYMMDD_HH24MI') DATEJOUR FROM Dual;
 
Spool E:\mon_repertoire\fichier_&DATEJOUR..csv;
 
REM on écrit le titre des colonnes qu'on veut
REM facultatif, car on pourrais aussi garder le nom des colonne du select avec HEADING ON
PROMPT  macol1; macol2; macol3
 
REM le select
SELECT  col1, col2, col3 FROM ma_table t1 ;
 
spool off;

création d’un fichier plat avec UTL_FILE

utl_file est un package oracle permettant de créer un fichier,

Pour info la procédure UTL_FIL.FOPEN permet d’ouvrir un fichier de 3 façon différente
« R » le fichier est ouvert en lecture (Read)
« W » le fichier est ouvert en écriture (Write)
« A » le fichier est ouvert en ajout (Append)

SET TERMOUT ON
SET serveroutput ON
SET serveroutput ON SIZE 100000
 
DECLARE
 
   CURSOR C_donnees IS
      SELECT  col1, col2, col3
      FROM table1;
 
   w_sysdate varchar2(20);
   w_repertoire varchar2(64);
   w_fichier varchar2(80);
   l_fichier_log      utl_file.file_type;
BEGIN
   -- INITIALISATION DES VARIABLES ---
   -----------------------------------
   SELECT To_Char(SysDate, 'YYYYMMDD_HH24MISS') DATEJOUR INTO w_sysdate FROM Dual;
   w_repertoire := '\\rep1';
   w_fichier := 'extraction_'||w_sysdate||'.csv';
   --  ouverture du ficher ---
   dbms_output.put_line('Début de la boucle');
   l_fichier_log  := utl_file.fopen( w_repertoire, w_fichier, 'A');
   --  PARCOUR LE SELECT ---
   -------------------------------------
   FOR r_donnees IN c_donnees
   LOOP
      -- ecriture des lignes du select dans le fichier
      utl_file.put_line(l_fichier_log, r_donnees.col1 || ';' || r_donnees.col2    || ';' || r_donnees.col3 );
   END LOOP;
   ---------    fermeture des fichiers et fin    ----------
   UTL_FILE.fclose_all;
   dbms_output.put_line('FIN du script');
END; -- fin de la procédure
/