julien88 Geschrieben 11. Oktober 2006 Teilen Geschrieben 11. Oktober 2006 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
johnhaltonx Geschrieben 11. Oktober 2006 Teilen Geschrieben 11. Oktober 2006 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
julien88 Geschrieben 11. Oktober 2006 Autor Teilen Geschrieben 11. Oktober 2006 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
johnhaltonx Geschrieben 11. Oktober 2006 Teilen Geschrieben 11. Oktober 2006 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; / Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
julien88 Geschrieben 12. Oktober 2006 Autor Teilen Geschrieben 12. Oktober 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
escito83 Geschrieben 12. Oktober 2006 Teilen Geschrieben 12. Oktober 2006 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); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.