Viele Wege führen nach Rom. Oder zu einer CSV Datei. In “Oracle: Erstellen einer .csv Datei aus einem Select” hatte ich einen einfachen weg gezeigt, wie man eine Abfrage direkt als csv Datei ausgeben kann.
Natürlich gibt es, falls man Zugriff auf den Oracle Server hat, eine elegantere Methode:
Erstellen einer Procedure, die per utl_file eine csv Datei erzeugt:
CREATE OR REPLACE FUNCTION dump_csv( p_query IN varchar2
, p_separator IN varchar2 DEFAULT ','
, p_dir IN varchar2 , p_filename IN varchar2 )
RETURN number
AUTHID CURRENT_USER IS
L_output utl_file.file_type;
l_theCursor integer DEFAULT dbms_sql.open_cursor;
l_columnValue varchar2(2000);
l_status integer;
l_colCnt number DEFAULT 0;
l_separator varchar2(10) DEFAULT '';
l_cnt number DEFAULT 0;
begin
l_output := utl_file.fopen( p_dir, p_filename, 'w' );
dbms_sql.parse( l_theCursor, p_query, dbms_sql.native );
FOR i IN 1 .. 255 loop
begin
dbms_sql.define_column( l_theCursor, i, l_columnValue, 2000 );
l_colCnt := i;
exception
when others then
IF ( sqlcode = -1007 ) then exit;
else
raise;
end IF;
end;
end loop;
dbms_sql.define_column( l_theCursor, 1, l_columnValue, 2000 );
l_status := dbms_sql.execute(l_theCursor);
loop
exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 );
l_separator := '';
FOR i IN 1 .. l_colCnt
loop
dbms_sql.column_value( l_theCursor, i, l_columnValue );
utl_file.put( l_output, l_separator || l_columnValue );
l_separator := p_separator;
end loop;
utl_file.new_line( l_output );
l_cnt := l_cnt+1;
end loop;
dbms_sql.close_cursor(l_theCursor);
utl_file.fclose( l_output );
RETURN l_cnt;
end dump_csv;
Die eleganz liegt darin, das man das Select nicht fest konfiguriert, sondern als Paramter an die Fuktion liefert. Über das Oracle Package dbms_sql wird dann das select zur Laufzeit abbildet.
Aufrufen kann man das dan mit einem einfach PL/SQL Block:
declare
l_rows number;
begin l_rows := dump_csv( 'select SYSDATE, USER from dual'
,',' -- Trennzeichen
,'/muell' -- Verzichnis
,'muell.csv' ); -- Dateiname
end;
oder natürlich über die Funktion execute in SQL*PLUS:
exec dbms_output.put_line('Exportierte Zeile: '||
dump_csv( 'select SYSDATE, USER from dual'
,',' -- Trennzeichen
,'/muell' -- Verzichnis
,'muell.csv' ); -- Dateiname
Leider muss ich zugeben, das mir das nicht eingefallen ist, sondern dem genialen Tom Kyte von Oracle (Link). Die Seite Ask Tom ist für alle Oracle Anwender ein Pflicht Bookmark
Viele Wege führen nach Rom. Oder zu einer CSV Datei. In “Oracle: Erstellen einer .csv Datei aus einem Select” hatte ich einen einfachen weg gezeigt, wie man eine Abfrage direkt...