복붙노트

[SQL] 어떻게이 CSV에 스풀 않습니다는 SQLPLUS를 사용하여 파일을 포맷?

SQL

어떻게이 CSV에 스풀 않습니다는 SQLPLUS를 사용하여 파일을 포맷?

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

내가 어떻게해야합니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.당신이 12.2을 사용하는 경우, 당신은 단순히 말할 수있다

    당신이 12.2을 사용하는 경우, 당신은 단순히 말할 수있다

    set markup csv on
    
  5. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    8.명시 적으로의 라인을 따라 뭔가로 구분 된 문자열을 생성하는 쿼리를 포맷 할 수 있습니다 :

    명시 적으로의 라인을 따라 뭔가로 구분 된 문자열을 생성하는 쿼리를 포맷 할 수 있습니다 :

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

    그리고 적절하게 출력 옵션을 설정합니다. 옵션으로, SQLPLUS에 COLSEP 변수는 명시 적으로 함께 연결된 필드의 문자열을 생성 할 필요없이 구분 된 파일을 생성하게됩니다. 그러나, 당신은 쉼표 문자를 포함 포함 수있는 열을 문자열 주위에 따옴표를 넣어해야합니다.

  9. ==============================

    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. ==============================

    10.나는 한 번 사용은 CSV (실제로 SSV)을 작성 DBMS_SQL 및 DBMS_OUTPUT하는 약간의 SQL * Plus에서 스크립트를 작성했습니다. 당신은 내 githup 저장소에서 찾을 수 있습니다.

    나는 한 번 사용은 CSV (실제로 SSV)을 작성 DBMS_SQL 및 DBMS_OUTPUT하는 약간의 SQL * Plus에서 스크립트를 작성했습니다. 당신은 내 githup 저장소에서 찾을 수 있습니다.

  11. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    14.나는 1994 년에 CSV로 덤프 테이블이 순수 SQLPLUS 스크립트를 썼다.

    나는 1994 년에 CSV로 덤프 테이블이 순수 SQLPLUS 스크립트를 썼다.

    스크립트 코멘트에서 언급 한 바와 같이, 오라클의 누군가가 오라클 지원 노트에 내 스크립트를 추가하는 듯했으나 속성없이.

    https://github.com/jkstill/oracle-script-lib/blob/master/sql/dump.sql

    이 스크립트는 또한 SQL의 * 로더에 대한 제어 파일 및 매개 변수 파일을 작성

  15. ==============================

    15.당신은 CSV 힌트를 사용할 수 있습니다. 다음 예를 참조하십시오 :

    당신은 CSV 힌트를 사용할 수 있습니다. 다음 예를 참조하십시오 :

    select /*csv*/ table_name, tablespace_name
    from all_tables
    where owner = 'SYS'
    and tablespace_name is not null;
    
  16. from https://stackoverflow.com/questions/643137/how-do-i-spool-to-a-csv-formatted-file-using-sqlplus by cc-by-sa and MIT license