2017-07-27 3 views
0

Ich möchte eine Möglichkeit, jede gegebene Tabelle in Oracle 11g zu einem CSV mit sql * plus dynamisch zu exportieren - anstatt jedes Mal die Spaltennamen explizit hart codieren zu müssen.Wie man eine gegebene Tabelle in Oracle nach csv mit sqlplus ausgibt

+0

Willkommen bei SO. [this] (https://asktom.oracle.com/pls/apex/f?p=100:11:::NO::P11_QUESTION_ID:88212348059) sollte Sie beginnen. Wenn Sie zu SQLcl wechseln, müssen Sie keinen Code schreiben. – jeff6times7

+0

Ah Entschuldigung, ich hätte den Vorbehalt hinzufügen sollen - in meinem Fall benutzt meine Firma einen Provider in Deutschland, der die Datenbank für uns verwaltet. Obwohl ich UTL_FILE Lösung verwenden könnte, denke ich, dass es schwierig sein würde, auf die Datei zuzugreifen. Es wurde von der Einrichtung eines SFTP gesprochen, aber der Fortschritt ist hier oft frustrierend langsam. Deshalb ist das Schreiben der CSV direkt mit sqlplus tatsächlich die leichtere - obwohl vielleicht auch schmutzigere - Option – Connor

Antwort

0

Nach Stapelüberlauf der Suche konnte ich keine genaue Antwort auf dieses Problem finden - also ich meine eigene Lösung entwickelt. Hier

ist das SQL-Skript, das ich geschrieben:

SET echo off 
SET verify off 
SET heading off 
SET pages 50000 
SET feedback off 
SET newpage none 
SET termout off 
SET linesize 900 
SET trimspool on 
SET serveroutput on 

define table_name = &1 
define spool_path = &2 
var rc refcursor 
column qry new_val capture 

SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry 
    FROM user_tab_cols 
WHERE table_name = '&table_name'; 



spool &spool_path 

SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_id) 
    FROM user_tab_cols 
WHERE table_name = '&table_name'; 

BEGIN 

FOR v_rec IN (&capture) LOOP 

dbms_output.put_line(v_rec.rec); 

END LOOP; 

END; 
/

spool off 

EXIT 

Das Skript benötigt zwei Parameter - der erste Parameter ist der Name der Tabelle, und die zweite ist die Spule Weg.

Wesentlichen die erste Abfrage:

SELECT 'select ''"'' || ' || listagg(column_name,' || ''","'' || ') within group (order by column_id) || ' || ''"'' as rec from &table_name' qry 
    FROM user_tab_cols 
WHERE table_name = '&table_name'; 

erstellt dynamisch eine neue select-Anweisung (die in die & Capture Substitutionsvariable lädt) mit user_tab_cols und listagg jeden Spaltennamen auf eine einzige Zeile zu erzwingen - das dynamisch erstellt wählen Anweisung wird im Wesentlichen jede Spalte zusammen durch Kommata getrennt verketten. Später, wenn wir spoolen, durchlaufen wir die dynamisch erzeugte select-Anweisung, um jede Datenzeile zu erzeugen.

Der Header wird durch eine ähnliche Abfrage erzeugt (die erste Aktion, nachdem wir mit dem Spooling begonnen haben), aber dafür können wir einfach die Spaltenkopfnamen zusammen listen.

Es ist einfacher zu verstehen, indem Sie die zwei Abfragen auf einer Tabelle Ihrer Wahl testen, um das Ergebnis zu sehen!

0

Bitte verwenden Sie die folgende Syntax.

SET MARKUP HTML ON SPOOL ON 
HEAD "<title>Data Extract</title> - <meta http-equiv='Content-Type' content='application/vnd.ms-excel;'> 
<style type='text/css'> 
</style>" 
SET ECHO OFF 
SPOOL output.xls 
select * from &tablename ; 
spool off 
exit 

Geben Sie den Tabellennamen ein, wenn Sie dazu aufgefordert werden.

Abhi

+0

Es gibt ein paar Probleme mit diesem - es produziert letztlich keine .csv-Datei. Es wiederholt auch regelmäßig die Spaltenüberschriften. – Connor

+0

Hallo Connor - Bitte fügen Sie "Überschrift entfernen" hinzu, um die Überschrift zu entfernen. & ja, ich habe einen Code für XLS realisiert, aber du kannst xls als .csv & open in jedem anderen Editor speichern. –

+0

Das ist wahr, aber das ist auch ein zusätzlicher Schritt - entweder von mir manuell die Datei zu öffnen, um zu konvertieren oder ein Skript in VBA schreiben oder so – Connor

0

können Sie die Option SET colsep verwenden.

SET COLSEP "," 
SET PAGES 0 
SET FEEDBACK OFF 
SPOOL output.csv 
select * from HR.employees; 
spool off 
exit 
+0

Ich habe die Waffe ein wenig gesprungen - ich begann, eine Tabelle als Test zu extrahieren und es schien, Daten im Terminal schön auszugeben, aber die CSV, wenn fertig ist ein Durcheinander. – Connor

+0

Sie könnten andere Col-Separatoren verwenden. wie "|" . Wenn Sie in Excel öffnen, können Sie Daten-> Text zu Spalten -> durch "|" –

+0

Ich bevorzuge eine Lösung, bei der eine saubere CSV in einem einzigen sauberen Schritt produziert wird.Ich denke, dass das auch Zeilen über mehrere Zeilen verteilt, anstatt dass es ein Trennzeichenproblem ist? – Connor