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
Antwort
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!
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
Es gibt ein paar Probleme mit diesem - es produziert letztlich keine .csv-Datei. Es wiederholt auch regelmäßig die Spaltenüberschriften. – Connor
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. –
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
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
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
Sie könnten andere Col-Separatoren verwenden. wie "|" . Wenn Sie in Excel öffnen, können Sie Daten-> Text zu Spalten -> durch "|" –
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
- 1. Oracle-sqlplus
- 2. Oracle-SQLPLUS
- 3. Connect SQLplus in oracle
- 4. Oracle: Set NLS_PARAMETERS mit sqlplus
- 5. CSV in Oracle Tabelle laden
- 6. oracle sqlplus Befehlszeile Frage
- 7. Wie spule ich mit SQLPLUS auf eine CSV-formatierte Datei?
- 8. konvertieren Epoche bisher in sqlplus/Oracle
- 9. Wie erhält man Primärschlüssel-Spaltennamen für eine gegebene Tabelle?
- 10. sqlplus in CSV wissenschaftliche Zahl Umwandlung
- 11. Wie man etwas in eine gegebene Klasse in Matlab einwickelt
- 12. Header-Formatierung beim Spoolen einer CSV-Datei in sqlplus
- 13. Legen Sie in Oracle-Tabelle aus CSV-Python mit
- 14. Druckfehler mit sqlplus
- 15. Beenden nach Skript in SQLPlus?
- 16. Wie man einen Stream mit highland.js ausgibt?
- 17. Oracle plsql Switch Case und sqlplus Spool
- 18. Wie erstellt man eine partitionierte Oracle-Tabelle in SQLAlchemy?
- 19. Oracle sqlplus verschachtelt Auswahl funktioniert nicht
- 20. Trigger kann nicht mit SQLPlus in Oracle erstellt werden
- 21. Gruppenkettenzeichen in eine gegebene Länge
- 22. Durchsuchen einer Oracle-Tabelle nach einem Wert
- 23. Postgresql: Gibt es eine psql-Version von "@@" von Oracle sqlplus?
- 24. Update Oracle-Tabelle mit Werten aus der CSV-Datei
- 25. Wie gewährt man Benutzern in Oracle Privilegien?
- 26. ORACLE SQL CSV Spaltenvergleich
- 27. PolymerJS: Wie man Modelldaten ausgibt?
- 28. CSV in Oracle-Datenbank importieren
- 29. Wie man Typeinfo in gdb ausgibt
- 30. Wie man sklearn standardscaler ausgibt
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
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