일부 쿼리를 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