当前位置:  开发笔记 > 数据库 > 正文

如何使用SQLPLUS假脱机到CSV格式的文件?

如何解决《如何使用SQLPLUS假脱机到CSV格式的文件?》经验,为你挑选了8个好方法。

我想提取一些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脚本来删除逗号之前出现的空格.

像这样的东西可能有用...(我的sed技能非常生疏,所以这可能需要工作)

sed 's/\s+,/,/' myfile.csv 


sed命令是:cat myfile.csv | sed -e's/[\ t]*|/|/g; s/| []*/|/g'> myfile.csv.无论如何,甲骨文真的很糟糕.
要获得带有列名的标题,请使用`set pagesize 1000`而不是0.在我以前的注释中,您不能重定向到同一个文件:`cat myfile.csv | sed -e's/[\ t]*|/|/g; s/| []*/|/g'> my_other_file.csv`.

2> 小智..:

我将此命令用于提取维度表(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 '|', .*, '|'
  from 
where spool off

并且工作.我不使用sed格式化输出文件.



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> BobC..:

如果你使用12.2,你可以简单地说

set markup csv on



5> Lalit Kumar ..:

使用较新版本的客户端工具,可以使用多种选项来格式化查询输出.其余的是将其假脱机到文件或将输出保存为文件,具体取决于客户端工具.以下是一些方法:

在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 Developer Version 4.1

或者,您可以在SQL Developer中使用新提示./*csv*/

/*csv*/

例如,在我的SQL Developer版本3.2.20.10中:

在此输入图像描述

现在您可以将输出保存到文件中.

SQL Developer版本4.1

在SQL Developer 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> Tony Andrews..:

这很粗糙,但是:

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> ConcernedOfT..:

您可以显式格式化查询以生成带有以下内容的分隔字符串:

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

并根据需要设置输出选项.作为一个选项,SQLPlus上的COLSEP变量将允许您生成分隔文件,而无需显式生成字段连接在一起的字符串.但是,您必须在可能包含嵌入逗号字符的任何列上的字符串周围加引号.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有