[sql] SQLPLUS를 사용하여 CSV 형식 파일로 스풀링하려면 어떻게합니까?

일부 쿼리를 CSV 출력 형식으로 추출하고 싶습니다. 불행히도, 멋진 SQL 클라이언트 또는 언어를 사용하여 사용할 수는 없습니다. SQLPLUS를 사용해야합니다.

어떻게합니까?



답변

12.2를 사용하는 경우 간단히 말할 수 있습니다.

set markup csv on
spool myfile.csv


답변

필드 사이에 공백이 있지만 다음을 사용할 수도 있습니다.

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를 사용하지 않습니다.


답변

비슷한 문제가 있습니다 …

SQLPLUS에서 CSV 파일을 스풀링해야하지만 출력에 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 명령을 사용하면 원하는 출력을 얻도록 형식을 지정할 수 있습니다. 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>
  • 4.1 이전의 SQL 개발자 버전

또는 SQL Developer 에서 새로운 힌트 를 사용할 수 있습니다 ./*csv*/

/*csv*/

예를 들어, SQL Developer Version 3.2.20.10에서 :

여기에 이미지 설명을 입력하십시오

이제 출력을 파일로 저장할 수 있습니다.

  • SQL 개발자 버전 4.1

SQL Developer 버전 4.1의 새로운 기능으로 sqlplus 명령과 같이 다음을 사용하고 스크립트로 실행하십시오. 쿼리에 힌트가 필요하지 않습니다.

SET SQLFORMAT csv

이제 출력을 파일로 저장할 수 있습니다.


답변

나는 이것이 오래된 스레드라는 것을 알고 있지만 아무도 열 제목 아래에서 밑줄을 제거 할 수있는 밑줄 옵션을 언급하지 않았다는 것을 알았습니다.

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;


답변

조잡하지만,

set pagesize 0 linesize 500 trimspool on feedback off echo off

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

spool emp.csv
/
spool off