Veröffentlicht 11. Oktober 200618 j Ich suche eine Funktion die mir die Daten aus einer Abfrage in einem File speichert. Bsp. select * from Tabelle1 where id = 1 Die gefundenen Daten sollen automatisch in ein File geschrieben werden. Hierzu habe ich den Spool befehl gefunden, allerdings sagte mir man direkt das dieser ziemlich veraltet sei. Nach einigen Recherchen habe ich auch noch den Befehl utl_file gefunden, weiß allerdings nicht wie der anzuwenden ist. Kann mir da wer helfen ?
11. Oktober 200618 j utl_file schreibt auf dem datenbankserver in ein Verzeichnis Spool schreibt auf dem Client Wo möchtest du das File ablegen ? Und: wieso ist spool veraltet? Um Welche Datenmengen geht es ?
11. Oktober 200618 j es wurde mir gesagt das es nicht von vorteil wäre mit spool zu arbeiten, möchte es aber dennoch ausprobieren. Eigentlich soll er auf dem Client speichern, hab aber auch Serverzugriff ... Wie würde ich den Spool richtig einbinden ?
11. Oktober 200618 j vor der abfrage in das sql script für SQLPLUS ( spool ist ein sqlplus befehl, kein standard SQL) ein spool pfad_auf_dem_client/dateiname; select * from table; end spool; Was die vor und nachteile angeht, um welche Datenmengen geht es denn ? Bei großen Datenmengen muss Spool alles über das Netzwerk zum client übertragen, während UTL_File auf dem Server schreibt. btw. Welche Oracle Version? PL/SQl Lösung mit UTL_File: 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; / You would use that for example like this: create or replace procedure test_dump_csv as l_rows number; begin l_rows := dump_csv( 'select * from all_users where rownum < 25', ',', '/tmp', 'test.dat' ); end; /
12. Oktober 200618 j Erst einmal danke für deine Hilfe john. Ich arbeite mit einen Oracle Client 10g Deine Function sieht ja fein aus, allerdings verstehe ich da gar nichts von :confused: Ich möchte gerne erreichen das eine Function mir die Ergebnisse die mir ein SQL Befehl liefert, in eine Datei schreibt. Bsp. select spalte1 from tabelle where id > 5 Diese Ergebnisse möchte ich gerne in ein File geschrieben bekommen
12. Oktober 200618 j einfach mal bei google. nach utl_file suchen, die ersten beiden treffer sind definitiv schon mal sehr brauchbar: http://www.google.de/search?hl=de&q=utl_file&btnG=Suche&meta=lr%3Dlang_de das beispiel von john geht natürlich schon ein wenig mehr in die tiefe, allerdings kann man auch zunächst einmal 'klein' anfangen. also eine datei erzeugen, ein paar fixe wörter dort hinein schreiben und die datei schließen. v_file := UTL_FILE.FOPEN('C:\temp','test.txt', 'w'); UTL_FILE.PUT_LINE(v_file,' Überschrift'); UTL_FILE.NEW_LINE (v_file); UTL_FILE.PUT_LINE(v_file,'Erste Zeile'); .... UTL_FILE.FCLOSE(v_file);
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.