Как мне перейти к файлу в формате CSV с помощью SQLPLUS?
Я хочу извлечь некоторые запросы в формат CSV. К сожалению, я не могу использовать какой-либо причудливый клиент SQL или любой язык для этого. Я должен использовать SQLPLUS.
Как мне это сделать?
13 ответов:
вы также можете использовать следующее, хотя он вводит пробелы между полями.
set colsep , -- separate columns with a comma set pagesize 0 -- No header rows set trimspool on -- remove trailing blanks set headsep off -- this may or may not be useful...depends on your headings. set linesize X -- X should be the sum of the column widths set numw X -- X should be the length you want for numbers (avoid scientific notation on IDs) spool myfile.csv select table_name, tablespace_name from all_tables where owner = 'SYS' and tablespace_name is not null;
вывод будет выглядеть так:
TABLE_PRIVILEGE_MAP ,SYSTEM SYSTEM_PRIVILEGE_MAP ,SYSTEM STMT_AUDIT_OPTION_MAP ,SYSTEM DUAL ,SYSTEM ...
Это было бы намного менее утомительно, чем печатать все поля и соединять их с запятыми. Вы можете выполнить простой сценарий sed, чтобы удалить пробелы, которые появляются перед запятой, если хотите.
что-то вроде этого может сработать...(мои навыки sed очень ржавые, так что это, вероятно, понадобится работа)
sed 's/\s+,/,/' myfile.csv
Я использую эту команду для скриптов, которые извлекают данные для размерных таблиц (DW). Итак, я использую следующий синтаксис:
set colsep '|' set echo off set feedback off set linesize 1000 set pagesize 0 set sqlprompt '' set trimspool on set headsep off spool output.dat select '|', <table>.*, '|' from <table> where <conditions> spool off
и работает. Я не использую sed для форматирования выходного файла.
Я вижу аналогичную проблему...
мне нужно катушка CSV-файл из SQLPLUS, но выход имеет 250 столбцов.
что я сделал, чтобы избежать раздражающего форматирования вывода SQLPLUS:
set linesize 9999 set pagesize 50000 spool myfile.csv select x from ( 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 x from ( ... here is the "core" select ) ); spool off
проблема в том, что вы потеряете имена заголовков столбцов...
вы можете добавить это:
set heading off spool myfile.csv select 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 x from ( 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 x from ( ... here is the "core" select ) ); spool off
Я знаю, что это хардкор, но это работает для меня...
в новых версиях клиентских средств Существует несколько вариантов форматирования выходных данных запроса. Остальное докачать файл и сохраните результат в виде файла в зависимости от инструмента клиента. Вот несколько способов:
- SQL * Plus
С помощью команд SQL * Plus вы можете форматировать, чтобы получить желаемый результат. Используйте шпульки чтобы катушка вывода в файл.
для например,
SQL> SET colsep , SQL> SET pagesize 20 SQL> SET trimspool ON SQL> SET linesize 200 SQL> SELECT * FROM scott.emp; EMPNO,ENAME ,JOB , MGR,HIREDATE , SAL, COMM, DEPTNO ----------,----------,---------,----------,---------,----------,----------,---------- 7369,SMITH ,CLERK , 7902,17-DEC-80, 800, , 20 7499,ALLEN ,SALESMAN , 7698,20-FEB-81, 1600, 300, 30 7521,WARD ,SALESMAN , 7698,22-FEB-81, 1250, 500, 30 7566,JONES ,MANAGER , 7839,02-APR-81, 2975, , 20 7654,MARTIN ,SALESMAN , 7698,28-SEP-81, 1250, 1400, 30 7698,BLAKE ,MANAGER , 7839,01-MAY-81, 2850, , 30 7782,CLARK ,MANAGER , 7839,09-JUN-81, 2450, , 10 7788,SCOTT ,ANALYST , 7566,09-DEC-82, 3000, , 20 7839,KING ,PRESIDENT, ,17-NOV-81, 5000, , 10 7844,TURNER ,SALESMAN , 7698,08-SEP-81, 1500, , 30 7876,ADAMS ,CLERK , 7788,12-JAN-83, 1100, , 20 7900,JAMES ,CLERK , 7698,03-DEC-81, 950, , 30 7902,FORD ,ANALYST , 7566,03-DEC-81, 3000, , 20 7934,MILLER ,CLERK , 7782,23-JAN-82, 1300, , 10 14 rows selected. SQL>
- SQL Developer Version pre 4.1
в качестве альтернативы, вы можете использовать новый
/*csv*/
подсказка на SQL Developer./*csv*/
например, в моем SQL Developer Version 3.2.20.10:
теперь вы можете сохранить вывод в файл.
- версия для разработчиков SQL 4.1
New в SQL Developer версии 4.1, используйте следующую команду так же, как sqlplus и запустить как скрипт. Нет необходимости в подсказке в запросе.
SET SQLFORMAT csv
теперь вы можете сохранить вывод в файл.
Это грубо, но:
set pagesize 0 linesize 500 trimspool on feedback off echo off select '"' || empno || '","' || ename || '","' || deptno || '"' as text from emp spool emp.csv / spool off
Я знаю, что это старый поток, однако я заметил, что никто не упомянул опцию подчеркивания, которая может удалить подчеркивания под заголовками столбцов.
set pagesize 50000--50k is the max as of 12c set linesize 10000 set trimspool on --remove trailing blankspaces set underline off --remove the dashes/underlines under the col headers set colsep ~ select * from DW_TMC_PROJECT_VW;
вы можете явно отформатировать запрос, чтобы создать строку с разделителями с чем-то вроде:
select '"'||foo||'","'||bar||'"' from tab
и настроить параметры вывода соответствующим образом. Как вариант, переменная COLSEP на SQLPlus позволит вам создавать файлы с разделителями без необходимости явно генерировать строку с полями, объединенными вместе. Однако вам придется поставить кавычки вокруг строк в любых столбцах, которые могут содержать встроенные символы запятой.
предпочитаю использовать "set colsep" в приглашении sqlplus вместо редактирования имени col по одному. Использовать sed для редактирования выходного файла.
set colsep '","' -- separate columns with a comma sed 's/^/"/;s/$/"/;s/\s *"/"/g;s/"\s */"/g' $outfile > $outfile.csv
Я когда-то написал немного SQL*плюс скрипт, который использует
dbms_sql
иdbms_output
для создания csv (фактически ssv). Вы можете найти его в моем репозитории githup.
пользоваться VI или Vim, чтобы написать SQL, использовать colsep с управлением (в VI и vim предшествовать сочетание клавиш Ctrl-С и ctrl-v в). Будьте уверены, чтобы установить linesize и pagesize, чтобы что-то рациональное и включите trimspool и trimout.
катушка его в файл. Затем...
sed -e 's/,/;/g' -e 's/ *{ctrl-a} */,/g' {spooled file} > output.csv
что sed вещь может быть превращена в скрипт. "*"До и после ctrl-A выдавливает все бесполезные пробелы. Разве это не здорово, что они потрудились включить вывод html из sqlplus, но не родной csv?????
Я делаю это так, потому что он обрабатывает запятые в данных. Я превращаю их в точки с запятой.
вы должны знать, что значения полей могут содержать запятые и символы кавычек, поэтому некоторые из предложенных ответов не будут работать, так как выходной файл CSV не будет правильным. Чтобы заменить символы кавычек в поле и заменить его символом двойной кавычки, можно использовать функцию замены, предоставляемую oracle, чтобы изменить одинарную кавычку на двойную кавычку.
set echo off set heading off set feedback off set linesize 1024 -- or some other value, big enough set pagesize 50000 set verify off set trimspool on spool output.csv select trim( '"' || replace(col1, '"', '""') || '","' || replace(col2, '"', '""') || '","' || replace(coln, '"', '""') || '"' ) -- etc. for all the columns from yourtable / spool off
или, если вы хотите одинарной кавычки для полей:
set echo off set heading off set feedback off set linesize 1024 -- or some other value, big enough set pagesize 50000 set verify off set trimspool on spool output.csv select trim( '"' || replace(col1, '''', '''''') || '","' || replace(col2, '''', '''''') || '","' || replace(coln, '''', '''''') || '"' ) -- etc. for all the columns from yourtable / spool off