Как мне спулировать файл в формате CSV с помощью SQLPLUS? - PullRequest
132 голосов
/ 13 марта 2009

Я хочу извлечь некоторые запросы в выходной формат CSV. К сожалению, я не могу использовать какой-либо причудливый клиент SQL или любой другой язык для этого. Я должен использовать SQLPLUS.

Как мне это сделать?

Ответы [ 14 ]

149 голосов
/ 17 марта 2009

Вы также можете использовать следующее, хотя оно вводит пробелы между полями.

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 
33 голосов
/ 12 ноября 2010

Я использую эту команду для сценариев, которые извлекают данные для таблиц измерений (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 для форматирования выходного файла.

20 голосов
/ 20 ноября 2009

вижу похожую проблему ...

Мне нужно спулировать 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

Я знаю, это своего рода хардкор, но он работает для меня ...

16 голосов
/ 18 июня 2015

В новых версиях клиентских инструментов существует несколько вариантов форматирования вывода запроса. Остальное - спулингировать в файл или сохранить результат в виде файла, в зависимости от клиентского инструмента. Вот несколько способов:

  • SQL * Plus

Используя команды SQL * Plus, вы можете отформатировать, чтобы получить желаемый результат. Используйте SPOOL для буферизации вывода в файл.

Например,

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 до 4.1

В качестве альтернативы вы можете использовать новый /*csv*/ подсказка в SQL Developer .

/*csv*/

Например, в моем SQL Developer версии 3.2.20.10 :

enter image description here

Теперь вы можете сохранить вывод в файл.

  • Версия для разработчиков SQL 4.1

Новое в SQL Developer версии 4.1, используйте следующую команду sqlplus и запустите ее как скрипт. Нет необходимости в подсказке в запросе.

SET SQLFORMAT csv

Теперь вы можете сохранить вывод в файл.

14 голосов
/ 15 февраля 2017

Если вы используете 12.2, вы можете просто сказать

set markup csv on
9 голосов
/ 13 марта 2009

Это сыро, но:

set pagesize 0 linesize 500 trimspool on feedback off echo off

select '"' || empno || '","' || ename || '","' || deptno || '"' as text
from emp

spool emp.csv
/
spool off
8 голосов
/ 07 сентября 2016

Я знаю, что это старый поток, однако я заметил, что никто не упомянул опцию подчеркивания, которая может удалить подчеркивания под заголовками столбцов.

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;
7 голосов
/ 13 марта 2009

Вы можете явно отформатировать запрос, чтобы получить строку с разделителями, которая выглядит примерно так:

select '"'||foo||'","'||bar||'"'
  from tab

И настройте параметры вывода соответствующим образом. Как вариант, переменная COLSEP в SQLPlus позволит вам создавать файлы с разделителями без явной генерации строки с объединенными полями. Однако вам придется заключать в кавычки строки в любых столбцах, которые могут содержать встроенные запятые.

4 голосов
/ 25 февраля 2010

предпочитают использовать "set colsep" в приглашении sqlplus вместо редактирования имени col по одному. Используйте sed для редактирования выходного файла.

set colsep '","'     -- separate columns with a comma
sed 's/^/"/;s/$/"/;s/\s *"/"/g;s/"\s */"/g' $outfile > $outfile.csv
3 голосов
/ 11 июля 2014

Я однажды написал небольшой сценарий SQL * Plus, который использует dbms_sql и dbms_output для создания CSV (на самом деле SSV). Вы можете найти его в моем хранилище githup .

...