1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
create or replace procedure Import_CSV_ToOracleTable( p_table in varchar2,p_cnames in varchar2,p_dir in varchar2,p_filename in varchar2,p_delimiter in varchar2 default '|' )IS
/************************************************************************************************
Description : Procedure permettant d'importer un fichier csv dans une table oracle
Parametres :
p_table -> Table destination, doit avec les memes champs que le fichier source .csv
p_cnames -> liste des colonnes séparée par ',' exemple : col1,col2,col3
p_dir -> Repertoire du fichier source. Qu'on peut créer avec la fonction CREATE DIRECTORY d'oracle exemple : CREATE DIRECTORY MON_REPERTOIRE AS C:\Temp
p_filename -> Nom du fichier avec l'extension exemple : 'monfichier.csv'
p_delimiter -> Séparateur de champ pour chaque colonne de la requete exemple : ';'
Auteur : ZINZINDOHOUE ETIENNE
***********************************************************************************************/
l_input utl_file.file_type;
l_theCursor integer default dbms_sql.open_cursor;
l_buffer varchar2(4000);
l_lastLine varchar2(4000);
l_status integer;
l_colCnt number default 0;
l_cnt number default 0;
l_sep char(1) default NULL;
l_errmsg varchar2(4000);
BEGIN
l_input := utl_file.fopen( p_dir, p_filename, 'r' );
l_buffer := 'insert into ' || p_table || ' values ( '; l_colCnt := length(p_cnames)-length(replace(p_cnames,',',))+1;
for i in 1 .. l_colCnt
loop l_buffer := l_buffer || l_sep || ':b'||i; l_sep := ',';
end loop; l_buffer := l_buffer || ')';
dbms_sql.parse( l_theCursor, l_buffer, dbms_sql.native );
loop begin utl_file.get_line( l_input, l_lastLine ); exception
when NO_DATA_FOUND then exit;
end;
l_buffer := l_lastLine || p_delimiter;
for i in 1 .. l_colCnt
loop dbms_sql.bind_variable( l_theCursor, ':b'||i, substr( l_buffer, 1, instr(l_buffer,p_delimiter)-1 ) ) ;
l_buffer := substr( l_buffer, instr(l_buffer,p_delimiter)+1 );
end loop;
begin l_status := dbms_sql.execute(l_theCursor); l_cnt := l_cnt + 1; exception
when others then l_errmsg := sqlerrm;
insert into badlog ( errm, data ) values ( l_errmsg, l_lastLine );
end; end loop;
dbms_sql.close_cursor(l_theCursor); utl_file.fclose( l_input );
commit; --return l_cnt;
END Import_CSV_ToOracleTable; |