[SQL] 어떻게이 CSV에 스풀 않습니다는 SQLPLUS를 사용하여 파일을 포맷?
SQL어떻게이 CSV에 스풀 않습니다는 SQLPLUS를 사용하여 파일을 포맷?
나는 CSV 출력 형식으로 일부 쿼리를 추출합니다. 불행하게도, 나는 어떤 멋진 SQL 클라이언트 또는 그것을 할 어떤 언어를 사용할 수 없습니다. 나는 SQLPLUS를 사용해야합니다.
내가 어떻게해야합니까?
해결법
-
==============================
1.이 필드 사이에 공백을 소개 않지만 당신은 또한 다음을 사용할 수 있습니다.
이 필드 사이에 공백을 소개 않지만 당신은 또한 다음을 사용할 수 있습니다.
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 's/\s+,/,/' myfile.csv
-
==============================
2.나는 차원 테이블 (DW)에 대한 데이터를 추출 스크립트에 대해이 명령을 사용합니다. 그래서, 나는 다음과 같은 구문을 사용합니다 :
나는 차원 테이블 (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
그리고 작동합니다. 나는 형식 출력 파일을 나오지도 사용하지 마십시오.
-
==============================
3.나는 비슷한 문제를 볼 ...
나는 비슷한 문제를 볼 ...
나는 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
나는 좀 하드 코어`의 알고 있지만 그것은 나를 위해 작동 ...
-
==============================
4.당신이 12.2을 사용하는 경우, 당신은 단순히 말할 수있다
당신이 12.2을 사용하는 경우, 당신은 단순히 말할 수있다
set markup csv on
-
==============================
5.클라이언트 도구의 최신 버전으로, 쿼리의 출력 형식 여러 옵션이 있습니다. 나머지는 파일에 스풀 또는 클라이언트 도구에 따라 파일로 결과를 저장하는 것입니다. 여기에 방법의 몇 가지 있습니다 :
클라이언트 도구의 최신 버전으로, 쿼리의 출력 형식 여러 옵션이 있습니다. 나머지는 파일에 스풀 또는 클라이언트 도구에 따라 파일로 결과를 저장하는 것입니다. 여기에 방법의 몇 가지 있습니다 :
는 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 Developer의 새 / * CSV * / 힌트를 사용할 수 있습니다.
/*csv*/
예를 들어, 내 SQL Developer의 버전 3.2.20.10 :
이제 당신은 파일에 출력을 저장 할 수있다.
새로운 SQL 개발자 버전 4.1에서 사용하는 단지 SQLPLUS 명령과 스크립트로 실행처럼 다음과 같습니다. 어떤 쿼리에 힌트의 필요가 없습니다.
SET SQLFORMAT csv
이제 당신은 파일에 출력을 저장 할 수있다.
-
==============================
6.나는 그러나 나는 아무도 열 머리글 아래에 밑줄을 제거 할 수 있습니다 밑줄 옵션을 언급되지 것을 발견,이 오래된 스레드 알고 있습니다.
나는 그러나 나는 아무도 열 머리글 아래에 밑줄을 제거 할 수 있습니다 밑줄 옵션을 언급되지 것을 발견,이 오래된 스레드 알고 있습니다.
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.그것은 원유,하지만 :
그것은 원유,하지만 :
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.명시 적으로의 라인을 따라 뭔가로 구분 된 문자열을 생성하는 쿼리를 포맷 할 수 있습니다 :
명시 적으로의 라인을 따라 뭔가로 구분 된 문자열을 생성하는 쿼리를 포맷 할 수 있습니다 :
select '"'||foo||'","'||bar||'"' from tab
그리고 적절하게 출력 옵션을 설정합니다. 옵션으로, SQLPLUS에 COLSEP 변수는 명시 적으로 함께 연결된 필드의 문자열을 생성 할 필요없이 구분 된 파일을 생성하게됩니다. 그러나, 당신은 쉼표 문자를 포함 포함 수있는 열을 문자열 주위에 따옴표를 넣어해야합니다.
-
==============================
9.대신 하나 COL 이름을 편집하는 프롬프트 SQLPLUS에서 "세트 colsep"를 사용하는 것을 선호합니다. 를 사용하여 출력 파일을 편집 나오지.
대신 하나 COL 이름을 편집하는 프롬프트 SQLPLUS에서 "세트 colsep"를 사용하는 것을 선호합니다. 를 사용하여 출력 파일을 편집 나오지.
set colsep '","' -- separate columns with a comma sed 's/^/"/;s/$/"/;s/\s *"/"/g;s/"\s */"/g' $outfile > $outfile.csv
-
==============================
10.나는 한 번 사용은 CSV (실제로 SSV)을 작성 DBMS_SQL 및 DBMS_OUTPUT하는 약간의 SQL * Plus에서 스크립트를 작성했습니다. 당신은 내 githup 저장소에서 찾을 수 있습니다.
나는 한 번 사용은 CSV (실제로 SSV)을 작성 DBMS_SQL 및 DBMS_OUTPUT하는 약간의 SQL * Plus에서 스크립트를 작성했습니다. 당신은 내 githup 저장소에서 찾을 수 있습니다.
-
==============================
11.제어-A와 SQL, 사용 colsep를 작성하는 VI 또는 정력을 사용 (A와 VI와 정력 앞에하려면 Ctrl-A에서 CTRL-V). 합리적인 뭔가에 LINESIZE 및 페이지 크기를 설정하고 trimspool 및 trimout를 켜십시오.
제어-A와 SQL, 사용 colsep를 작성하는 VI 또는 정력을 사용 (A와 VI와 정력 앞에하려면 Ctrl-A에서 CTRL-V). 합리적인 뭔가에 LINESIZE 및 페이지 크기를 설정하고 trimspool 및 trimout를 켜십시오.
파일에 스풀. 그때...
sed -e 's/,/;/g' -e 's/ *{ctrl-a} */,/g' {spooled file} > output.csv
그 나오지 것은 스크립트로 전환 할 수 있습니다. 은 "*"에서 Ctrl-A가 좋다고 이전과 이후의 모든 쓸모없는 공간. 그것은 그들이 기본 CSV를 SQLPLUS에서 HTML 출력을 가능하게 방해 만하지 않는 것이 위대한 아닌가요 ?????
이 데이터에 쉼표를 처리하기 때문에 나는이 방법을한다. 나는 세미콜론로 변합니다.
-
==============================
12.당신은 필드의 값이 쉼표와 인용 문자를 포함 할 수 있다는 것을 알고 있어야한다, 그래서 제안 된 답변 중 일부는하지 작업의 CSV 출력 파일로 정확하지 않을 것입니다. 필드에 인용 문자를 대체하고, 큰 따옴표 문자로 교체하려면 큰 따옴표에 작은 따옴표를 변경하려면, 오라클이 제공하는 REPLACE 기능을 사용할 수 있습니다.
당신은 필드의 값이 쉼표와 인용 문자를 포함 할 수 있다는 것을 알고 있어야한다, 그래서 제안 된 답변 중 일부는하지 작업의 CSV 출력 파일로 정확하지 않을 것입니다. 필드에 인용 문자를 대체하고, 큰 따옴표 문자로 교체하려면 큰 따옴표에 작은 따옴표를 변경하려면, 오라클이 제공하는 REPLACE 기능을 사용할 수 있습니다.
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
-
==============================
13.CSV 파일을 만들 수 SQLPLUS를 사용하는 동안 문제가 발생했습니다. 한 번만 출력에 열 헤더를 원하고 수천 또는 수백만 개의 행이있는 경우, 당신은 페이지 크기 충분한 반복을 얻을 수 없습니다 설정할 수 없습니다. 이 솔루션은 다음 데이터를 얻기 위해 페이지 크기 = 0 다시 선택 발급, 페이지 크기 = 50로 시작하고 헤더를 구문 분석하는 것입니다. 아래의 bash는 스크립트를 참조하십시오 :
CSV 파일을 만들 수 SQLPLUS를 사용하는 동안 문제가 발생했습니다. 한 번만 출력에 열 헤더를 원하고 수천 또는 수백만 개의 행이있는 경우, 당신은 페이지 크기 충분한 반복을 얻을 수 없습니다 설정할 수 없습니다. 이 솔루션은 다음 데이터를 얻기 위해 페이지 크기 = 0 다시 선택 발급, 페이지 크기 = 50로 시작하고 헤더를 구문 분석하는 것입니다. 아래의 bash는 스크립트를 참조하십시오 :
#!/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/null set 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/null set 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 }
-
==============================
14.나는 1994 년에 CSV로 덤프 테이블이 순수 SQLPLUS 스크립트를 썼다.
나는 1994 년에 CSV로 덤프 테이블이 순수 SQLPLUS 스크립트를 썼다.
스크립트 코멘트에서 언급 한 바와 같이, 오라클의 누군가가 오라클 지원 노트에 내 스크립트를 추가하는 듯했으나 속성없이.
https://github.com/jkstill/oracle-script-lib/blob/master/sql/dump.sql
이 스크립트는 또한 SQL의 * 로더에 대한 제어 파일 및 매개 변수 파일을 작성
-
==============================
15.당신은 CSV 힌트를 사용할 수 있습니다. 다음 예를 참조하십시오 :
당신은 CSV 힌트를 사용할 수 있습니다. 다음 예를 참조하십시오 :
select /*csv*/ table_name, tablespace_name from all_tables where owner = 'SYS' and tablespace_name is not null;
from https://stackoverflow.com/questions/643137/how-do-i-spool-to-a-csv-formatted-file-using-sqlplus by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 아파치 스파크 DataFrame에 연결하여 열 (0) | 2020.03.15 |
---|---|
[SQL] 하위 쿼리 대 조인 (0) | 2020.03.15 |
[SQL] 날짜 범위를 비교 (0) | 2020.03.15 |
[SQL] 어떻게 SQL 쿼리를 여러 수를 얻으려면? (0) | 2020.03.15 |
[SQL] 오라클은 다음과 같은 경우 테이블 존재 (0) | 2020.03.15 |