Jak buforować do pliku w formacie CSV przy użyciu SQLPLUS?
143
Chcę wyodrębnić niektóre zapytania do formatu wyjściowego CSV. Niestety, nie mogę użyć do tego żadnego wymyślnego klienta SQL ani żadnego języka. Muszę używać SQLPLUS.
Proszę zaznaczyć jako poprawną odpowiedź udzieloną przez @BobC. Brakuje polecenia buforowania do wydrukowania pliku, ale jest to najprostsze rozwiązanie do eksportu danych w formacie csv.
rlar
Odpowiedzi:
28
Jeśli używasz wersji 12.2, możesz po prostu powiedzieć
Czy ktoś wie jak wyłączyć echo, oczywiste "wyłącz echo" nie wydaje się z tym działać?
Quaternion
Zakładając, że dzieje się tak, ponieważ wykonujesz skrypt i zapisujesz do pliku, powinieneś po prostu „wyłączyć termout”
BobC
155
Możesz również użyć następującego, chociaż wprowadza spacje między polami.
set colsep ,-- separate columns with a commaset pagesize 0-- No header rowsset trimspool on-- remove trailing blanksset headsep off-- this may or may not be useful...depends on your headings.set linesize X -- X should be the sum of the column widthsset numw X -- X should be the length you want for numbers (avoid scientific notation on IDs)
spool myfile.csvselect table_name, tablespace_name from all_tableswhere owner ='SYS'and tablespace_name isnotnull;
Byłoby to o wiele mniej uciążliwe niż wpisywanie wszystkich pól i łączenie ich przecinkami. Jeśli chcesz, możesz użyć prostego skryptu seda, aby usunąć białe znaki, które pojawiają się przed przecinkiem.
Coś takiego może zadziałać ... (moje umiejętności seda są bardzo zardzewiałe, więc prawdopodobnie będzie to wymagało pracy)
W wierszu kolsep brakuje znaku „,”. Prawdopodobnie przydadzą się również sekcje czołowe i rozmiar linii X. Edytuj odpowiedź, a ja ją zaakceptuję.
Daniel C. Sobral
5
Polecenie sed to: cat myfile.csv | sed -e 's / [\ t] * | / | / g; s / | [] * / | / g '> myfile.csv. W każdym razie Oracle naprawdę jest do bani.
Stan
2
I dostać nagłówek z nazwami kolumn używać set pagesize 1000zamiast 0. W moim poprzednim komentarzu, nie można przekierować do tego samego pliku: cat myfile.csv | sed -e 's/[ \t]*|/|/g ; s/|[ ]*/|/g' > my_other_file.csv.
Stan
1
Odfiltrowałem spacje i myślniki używane do podkreślenia grepi w trten sposób grep -v -- ----- myfile.csv | tr -d [:blank:] > myfile.csv.
ixe013
1
@slayernoah komenda spool może przyjąć ścieżkę do katalogu i nazwę pliku, dzięki czemu można dokładnie określić, gdzie zostanie umieszczony plik wyjściowy. W przeciwnym razie zależałoby to od lokalizacji, w której wykonujesz skrypt.
Gabe
35
Używam tego polecenia dla skryptów, które wyodrębniają dane do tabel wymiarowych (DW). Więc używam następującej składni:
set colsep '|'set echo offset feedback offset linesize 1000set pagesize 0set sqlprompt ''set trimspool onset headsep off
spool output.datselect'|',<table>.*,'|'from<table>where<conditions>
spool off
I działa. Nie używam seda do formatowania pliku wyjściowego.
Muszę buforować plik CSV z SQLPLUS, ale wynik ma 250 kolumn.
Co zrobiłem, aby uniknąć irytującego formatowania danych wyjściowych SQLPLUS:
set linesize 9999set pagesize 50000
spool myfile.csvselect xfrom(select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as xfrom(... here is the "core"select));
spool off
problem polega na tym, że stracisz nazwy nagłówków kolumn ...
możesz dodać to:
set heading off
spool myfile.csvselect col1_name||';'||col2_name||';'||col3_name||';'||col4_name||';'||col5_name||';'||col6_name||';'||col7_name||';'||col8_name||';'||col9_name||';'||col10_name||';'||col11_name||';'||col12_name||';'||col13_name||';'||col14_name||';'||col15_name||';'||col16_name||';'||col17_name||';'||col18_name||';'||col19_name||';'||col20_name||';'||col21_name||';'||col22_name||';'||col23_name||';'||col24_name||';'||col25_name||';'||col26_name||';'||col27_name||';'||col28_name||';'||col29_name||';'||col30_name from dual;select xfrom(select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as xfrom(... here is the "core"select));
spool off
Wiem, że to trochę hardcore, ale na mnie działa ...
czy potrzebujemy ||również podzapytań?, nie sądzę, że jest to wymagane dla podzapytań. ale tak, jest to wymagane do podstawowego wyboru.
davidb
Do czego służy dodatkowa warstwa zewnętrzna select x? To powinno działać bez niego. @davidb, masz rację, że konkatenacja nie jest wymagana w podstawowym podzapytaniu wewnętrznym, ale aliasowanie wszystkich kolumn jako col1, col2 ... itd. jest tam wymagany.
Amit Naidu
18
W nowszych wersjach narzędzi klienckich istnieje wiele opcji formatowania wyników zapytania. Reszta polega na zbuforowaniu go do pliku lub zapisaniu wyniku jako pliku w zależności od narzędzia klienta. Oto kilka sposobów:
SQL * Plus
Używając poleceń SQL * Plus, możesz sformatować, aby uzyskać żądany wynik. Użyj SPOOL do buforowania danych wyjściowych do pliku.
Alternatywnie, można użyć nową wskazówkę w SQL Developer ./*csv*/
/*csv*/
Na przykład w mojej wersji SQL Developer 3.2.20.10 :
Teraz możesz zapisać wynik do pliku.
SQL Developer w wersji 4.1.0
Nowość w SQL Developer w wersji 4.1, użyj następującego polecenia, podobnie jak polecenie sqlplus i uruchom jako skrypt. Nie ma potrzeby podpowiedzi w zapytaniu.
Wiem, że to stary wątek, ale zauważyłem, że nikt nie wspomniał o opcji podkreślenia, która może usunąć podkreślenia pod nagłówkami kolumn.
set pagesize 50000--50k is the max as of 12cset linesize 10000set trimspool on--remove trailing blankspacesset underline off--remove the dashes/underlines under the col headersset colsep ~select*from DW_TMC_PROJECT_VW;
Fajnie, jeśli chcesz mieć plik CSV z górnym wierszem zawierającym tytuł / nagłówki dla każdej kolumny. Pomogłoby to każdemu, kto chciałby wyświetlić plik csv i dowiedzieć się, na co patrzy, itp ...
Doc,
10
To surowe, ale:
set pagesize 0 linesize 500 trimspool on feedback off echo offselect'"'|| empno ||'","'|| ename ||'","'|| deptno ||'"'as textfrom emp
spool emp.csv/
spool off
Możesz jawnie sformatować zapytanie, aby utworzyć ciąg rozdzielany z czymś w rodzaju:
select'"'||foo||'","'||bar||'"'from tab
I odpowiednio skonfiguruj opcje wyjściowe. Opcjonalnie, zmienna COLSEP w SQLPlus pozwoli Ci tworzyć pliki rozdzielane bez konieczności jawnego generowania łańcucha z połączonymi polami. Będziesz jednak musiał umieścić cudzysłowy wokół łańcuchów we wszystkich kolumnach, które mogą zawierać osadzone znaki przecinka.
Należy pamiętać, że wartości pól mogą zawierać przecinki i znaki cudzysłowu, więc niektóre z sugerowanych odpowiedzi nie zadziałają, ponieważ plik wyjściowy CSV nie byłby poprawny. Aby zamienić znaki cudzysłowu w polu i zastąpić je znakiem podwójnego cudzysłowu, możesz użyć funkcji REPLACE udostępnianej przez Oracle, aby zmienić pojedynczy cudzysłów na podwójny cudzysłów.
set echo offset heading offset feedback offset linesize 1024-- or some other value, big enoughset pagesize 50000set verify offset trimspool on
spool output.csv
select trim('"'|| replace(col1,'"','""')||'","'|| replace(col2,'"','""')||'","'|| replace(coln,'"','""')||'"')-- etc. for all the columnsfrom yourtable
/
spool off
Lub, jeśli potrzebujesz pojedynczego cudzysłowu dla pól:
set echo offset heading offset feedback offset linesize 1024-- or some other value, big enoughset pagesize 50000set verify offset trimspool on
spool output.csv
select trim('"'|| replace(col1,'''','''''')||'","'|| replace(col2,'''','''''')||'","'|| replace(coln,'''','''''')||'"')-- etc. for all the columnsfrom yourtable
/
spool off
Użyj vi lub vim, aby napisać sql, użyj colsep z control-A (w vi i vim poprzedź ctrl-A ctrl-v). Pamiętaj, aby ustawić rozmiar linii i rozmiar strony na coś racjonalnego i włączyć trimspool i trimout.
umieścić go w pliku. Następnie...
sed -e 's/,/;/g'-e 's/ *{ctrl-a} */,/g'{spooled file}> output.csv
To sedno można zamienić w scenariusz. Znak „*” przed i po ctrl-A usuwa wszystkie bezużyteczne spacje. Czy to nie wspaniale, że zadali sobie trud włączenia wyjścia HTML z sqlplus, ale NIE natywnego csv ?????
Robię to w ten sposób, ponieważ obsługuje przecinki w danych. Zamieniam je w średniki.
To kończy się niepowodzeniem testu „Muszę używać SQLPlus”.
Daniel C. Sobral
0
Wystąpił problem podczas używania sqlplus do tworzenia plików CSV. Jeśli chcesz, aby nagłówki kolumn były wyświetlane tylko raz, a istnieją tysiące lub miliony wierszy, nie możesz ustawić rozmiaru strony na tyle dużego, aby nie uzyskać powtórzenia. Rozwiązaniem jest rozpoczęcie od pagesize = 50 i przeanalizowanie nagłówków, a następnie ponowne wydanie polecenia select z pageize = 0, aby uzyskać dane. Zobacz skrypt bash poniżej:
#!/bin/bash
FOLDER="csvdata_mydb"
CONN="192.168.100.11:1521/mydb0023.world"
CNT=0376
ORD="0376"TABLE="MY_ATTACHMENTS"
sqlplus -L logn/pswd@//${CONN}<<EOF >/dev/nullset pagesize 50;set verify off;set feedback off;set long 99999;set linesize 32767;set trimspool on;
col object_ddl format A32000;set colsep ,;set underline off;set headsep off;
spool ${ORD}${TABLE}.tmp;select*from tblspc.${TABLE}where rownum <2;
EOF
LINES=`wc -l ${ORD}${TABLE}.tmp | cut -f1 -d" "`[${LINES}-le 3]&&{
echo "No Data Found in ${TABLE}."}[${LINES}-gt 3]&&{
cat ${ORD}${TABLE}.tmp | sed -e 's/ * / /g'-e 's/^ //'-e 's/ ,/,/g'-e 's/, /,/g'| tail -n +3| head -n 1>./${ORD}${TABLE}.headers
}
sqlplus -L logn/pswd@//${CONN}<<EOF >/dev/nullset pagesize 0;set verify off;set feedback off;set long 99999;set linesize 32767;set trimspool on;
col object_ddl format A32000;set colsep ,;set underline off;set headsep off;
spool ${ORD}${TABLE}.tmp;select*from tblspc.${TABLE};
EOF
LINES=`wc -l ${ORD}${TABLE}.tmp | cut -f1 -d" "`[${LINES}-le 3]&&{
echo "No Data Found in ${TABLE}."}[${LINES}-gt 3]&&{
cat ${ORD}${TABLE}.headers >${FOLDER}/${ORD}${TABLE}.csv
cat ${ORD}${TABLE}.tmp | sed -e 's/ * / /g'-e 's/^ //'-e 's/ ,/,/g'-e 's/, /,/g'| tail -n +2| head -n -1>>${FOLDER}/${ORD}${TABLE}.csv
}
Odpowiedzi:
Jeśli używasz wersji 12.2, możesz po prostu powiedzieć
źródło
Możesz również użyć następującego, chociaż wprowadza spacje między polami.
Wynik będzie następujący:
Byłoby to o wiele mniej uciążliwe niż wpisywanie wszystkich pól i łączenie ich przecinkami. Jeśli chcesz, możesz użyć prostego skryptu seda, aby usunąć białe znaki, które pojawiają się przed przecinkiem.
Coś takiego może zadziałać ... (moje umiejętności seda są bardzo zardzewiałe, więc prawdopodobnie będzie to wymagało pracy)
źródło
set pagesize 1000
zamiast 0. W moim poprzednim komentarzu, nie można przekierować do tego samego pliku:cat myfile.csv | sed -e 's/[ \t]*|/|/g ; s/|[ ]*/|/g' > my_other_file.csv
.grep
i wtr
ten sposóbgrep -v -- ----- myfile.csv | tr -d [:blank:] > myfile.csv
.Używam tego polecenia dla skryptów, które wyodrębniają dane do tabel wymiarowych (DW). Więc używam następującej składni:
I działa. Nie używam seda do formatowania pliku wyjściowego.
źródło
Widzę podobny problem ...
Muszę buforować plik CSV z SQLPLUS, ale wynik ma 250 kolumn.
Co zrobiłem, aby uniknąć irytującego formatowania danych wyjściowych SQLPLUS:
problem polega na tym, że stracisz nazwy nagłówków kolumn ...
możesz dodać to:
Wiem, że to trochę hardcore, ale na mnie działa ...
źródło
||
również podzapytań?, nie sądzę, że jest to wymagane dla podzapytań. ale tak, jest to wymagane do podstawowego wyboru.select x
? To powinno działać bez niego. @davidb, masz rację, że konkatenacja nie jest wymagana w podstawowym podzapytaniu wewnętrznym, ale aliasowanie wszystkich kolumn jako col1, col2 ... itd. jest tam wymagany.W nowszych wersjach narzędzi klienckich istnieje wiele opcji formatowania wyników zapytania. Reszta polega na zbuforowaniu go do pliku lub zapisaniu wyniku jako pliku w zależności od narzędzia klienta. Oto kilka sposobów:
Używając poleceń SQL * Plus, możesz sformatować, aby uzyskać żądany wynik. Użyj SPOOL do buforowania danych wyjściowych do pliku.
Na przykład,
Alternatywnie, można użyć nową wskazówkę w SQL Developer .
/*csv*/
Na przykład w mojej wersji SQL Developer 3.2.20.10 :
Teraz możesz zapisać wynik do pliku.
Nowość w SQL Developer w wersji 4.1, użyj następującego polecenia, podobnie jak polecenie sqlplus i uruchom jako skrypt. Nie ma potrzeby podpowiedzi w zapytaniu.
Teraz możesz zapisać wynik do pliku.
źródło
Wiem, że to stary wątek, ale zauważyłem, że nikt nie wspomniał o opcji podkreślenia, która może usunąć podkreślenia pod nagłówkami kolumn.
źródło
To surowe, ale:
źródło
Możesz jawnie sformatować zapytanie, aby utworzyć ciąg rozdzielany z czymś w rodzaju:
I odpowiednio skonfiguruj opcje wyjściowe. Opcjonalnie, zmienna COLSEP w SQLPlus pozwoli Ci tworzyć pliki rozdzielane bez konieczności jawnego generowania łańcucha z połączonymi polami. Będziesz jednak musiał umieścić cudzysłowy wokół łańcuchów we wszystkich kolumnach, które mogą zawierać osadzone znaki przecinka.
źródło
wolą używać "set colsep" w zachęcie sqlplus zamiast edytować nazwę kolumny jeden po drugim. Użyj seda, aby edytować plik wyjściowy.
źródło
Kiedyś napisałem mały skrypt SQL * Plus, który używa
dbms_sql
idbms_output
tworzy csv (właściwie ssv). Możesz go znaleźć w moim repozytorium githup .źródło
Należy pamiętać, że wartości pól mogą zawierać przecinki i znaki cudzysłowu, więc niektóre z sugerowanych odpowiedzi nie zadziałają, ponieważ plik wyjściowy CSV nie byłby poprawny. Aby zamienić znaki cudzysłowu w polu i zastąpić je znakiem podwójnego cudzysłowu, możesz użyć funkcji REPLACE udostępnianej przez Oracle, aby zmienić pojedynczy cudzysłów na podwójny cudzysłów.
Lub, jeśli potrzebujesz pojedynczego cudzysłowu dla pól:
źródło
trim()
jest to konieczne.Użyj vi lub vim, aby napisać sql, użyj colsep z control-A (w vi i vim poprzedź ctrl-A ctrl-v). Pamiętaj, aby ustawić rozmiar linii i rozmiar strony na coś racjonalnego i włączyć trimspool i trimout.
umieścić go w pliku. Następnie...
To sedno można zamienić w scenariusz. Znak „*” przed i po ctrl-A usuwa wszystkie bezużyteczne spacje. Czy to nie wspaniale, że zadali sobie trud włączenia wyjścia HTML z sqlplus, ale NIE natywnego csv ?????
Robię to w ten sposób, ponieważ obsługuje przecinki w danych. Zamieniam je w średniki.
źródło
Wystąpił problem podczas używania sqlplus do tworzenia plików CSV. Jeśli chcesz, aby nagłówki kolumn były wyświetlane tylko raz, a istnieją tysiące lub miliony wierszy, nie możesz ustawić rozmiaru strony na tyle dużego, aby nie uzyskać powtórzenia. Rozwiązaniem jest rozpoczęcie od pagesize = 50 i przeanalizowanie nagłówków, a następnie ponowne wydanie polecenia select z pageize = 0, aby uzyskać dane. Zobacz skrypt bash poniżej:
źródło
Napisałem ten czysty skrypt SQLPlus, aby zrzucić tabele do CSV w 1994 roku.
Jak zauważono w komentarzach do skryptu, ktoś z Oracle umieścił mój skrypt w notatce Oracle Support, ale bez podania źródła.
https://github.com/jkstill/oracle-script-lib/blob/master/sql/dump.sql
Skrypt buduje również plik sterujący i plik parametrów dla SQL * LOADER
źródło
źródło
Możesz użyć podpowiedzi CSV. Zobacz poniższy przykład:
źródło