【问题标题】:Remove Blank Line In Between Select Queries When Spooling to CSV File 2假脱机到 CSV 文件 2 时删除选择查询之间的空白行
【发布时间】:2022-02-17 20:47:53
【问题描述】:

我有从 SQLPLUS (11.2.0.4) 执行的查询,并且输出被假脱机到文件。我在每行之后得到输出文件空行+查询中最后一列之后的许多空格。我已经在记事本++中打开了文件,我可以看到最后一列附加了大量空格并以 CRLF (windows) 结尾,最后一列是 varchar 4000。

我在互联网上阅读了大量与此相关的文章,但没有一篇对我有帮助。我试图设置 trimspool 开/关,trimout 开/关(顺便说一句 - 两个命令都被跳过),第 0 页,标题关闭,页面大小 0,第 0 页,空格 0,newpage nono

SQL 示例:

set termout off
set pagesize 0
set termout off
set pagesize 0
set heading off
set feedback off
set newpage none
set space 0
set linesize 8000
set longchunksize 200000 
/*above was tried step by step - no help*/

spool "G:/gggg/fffff.csv"
PROMT COL1|COL2|COL3

select col1||';'||col2||';'||nvl(col3,'') abc
FROM transactions;
spool off;

output (notepad++):
COL1|COL2|COL3CRLF
col1|col2|col3                                                              CRLF
col1|col2|col3                                                              CRLF
col1|col2|col3                                                              CRLF

output(linux)
COL1|COL2|COL3$
col1|col2|$
COL3      $

col1|col2|$
COL3      $

col1|col2|$
COL3      $
  1. 我必须使用 SQLPLUS。
  2. 要求输出文件不带双引号,并以 tilda 作为分隔符 例如
aaaa~bbbb~cccc~eeeeeeeeeeeeeeeeeeeeeeeeee
dddd~rrrr~bggggggg~rrrrrrrrrrrrrrrrrrrrrrrrrr
eeee~rrrrrrr~ttttttt~yyyyyyyyyyyyyyyyyyyyyyyyyy

列类型:

col1 integer
col2 varchar2(4000 BYTE)
col3 varchar2(4000 BYTE)

当前输出的样子

COL1NAME~COL2NAME~COL3NAME
aaaa~bbbb~cccc~eeeeeeeeeeeeeeeeeeeeeeeeee

dddd~rrrr~bggggggg~rrrrrrrrrrrrrrrrrrrrrrrrrr

eeee~rrrrrrr~ttttttt~yyyyyyyyyyyyyyyyyyyyyyyyyy

我想删除空行而不删减行中的字符。

我可以在记事本++中看到:

COL1NAME~COL2NAME~COL3NAMECRLF
aaaa~bbbb~cccc~eeeeeeeeeeeeeeeeeeeeeeeeee..................................CRLF
dddd~rrrr~bggggggg~rrrrrrrrrrrrrrrrrrrrrrrrrr..............................CRLF
eeee~rrrrrrr~ttttttt~yyyyyyyyyyyyyyyyyyyyyyyyyy............................CRLF

我可以在 linux 中看到(less 之后):

COL1NAME~COL2NAME~COL3NAME$
aaaa~bbbb~cccc~eeeeeeeeeeeeeeeeeeee$
eeeeee                             $
                                   $
dddd~rrrr~bggggggg~rrrrrrrrrrrrrrrr$
rrrrrrrrrr                         $
                                   $
eeee~rrrrrrr~ttttttt~yyyyyyyyyyyyyy$
yyyyyyyyyyyy                       $
                                   $

【问题讨论】:

  • 嗨,我找到了适合我的解决方案:``` SET HEADING OFF SET FEEDBACK OFF SET NEWPAGE NONE SET SPACE 0 SET TRIMSPOOL ON SET LINESIZE 32000 ``` 注意1:SQLPLUS 可以识别 trimspool ,SQL开发商没有。注意 2:coalesce(col2,'') 不起作用,如果 col2 为空,它总是返回空值,我希望空字符串。为了得到正确的结果,我使用了:``` CASE WHEN col2 is null or col2 = '' THEN '' ELSE col2 END ```
  • 不幸的是,我想将其作为答案,但我的帐户无法提供答案

标签: oracle oracle11g sqlplus


【解决方案1】:

你的桌子是什么样子的? COL3 是定义为 CHAR 还是 VARCHAR2?如果是 CHAR,则说明一切。

我们需要查看您的数据和表格,才能为您提供帮助,否则您要求我们猜测。

使用 HR 示例架构和位置表,注意 varchar2。

CREATE TABLE locations (
    location_id    NUMBER(4, 0),
    street_address VARCHAR2(40),
    postal_code    VARCHAR2(12),
    city           VARCHAR2(30)
        CONSTRAINT loc_city_nn NOT NULL ENABLE,
    state_province VARCHAR2(25),
    country_id     CHAR(2),
    CONSTRAINT loc_c_id_fk FOREIGN KEY ( country_id )
        REFERENCES hr.countries ( country_id )
    ENABLE
);

COUNTRY_ID 是 CHAR(2) - 因此,即使您只插入了 '1' 字符,您总是会看到该列有 2 个空格。

查询表,将 sqlformat 设置为 CSV,我会自动返回 CSV。

SQLPlus 11.2.0.4 大约是从 2008 年开始的,已经很老了。

这是您可以使用Oracle SQLcl 执行的操作 - 比 SQLPlus 更小、更强大且对用户更友好。此外,获得所需内容的代码更少。

SQLcl: Release 21.4 Production on Wed Feb 16 08:40:23 2022

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Wed Feb 16 2022 08:40:24 -05:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


login.sql found in the CWD. DB access is restricted for login.sql.
Adjust the SQLPATH to include the path to enable full functionality.
SQL> set pagesize 200
SQL> cd c:\users\jdsmith\desktop
SQL> spool peeps.csv
SQL> select * from locations;
"LOCATION_ID","STREET_ADDRESS","POSTAL_CODE","CITY","STATE_PROVINCE","COUNTRY_ID"
1000,"1297 Via Cola di Rie","00989","Roma","","IT"
1100,"93091 Calle della Testa","10934","Venice","","IT"
1200,"2017 Shinjuku-ku","1689","Tokyo","Tokyo Prefecture","JP"
1300,"9450 Kamiya-cho","6823","Hiroshima","","JP"
1400,"2014 Jabberwocky Rd","26192","Southlake","Texas","US"
1500,"2011 Interiors Blvd","99236","South San Francisco","California","US"
1600,"2007 Zagora St","50090","South Brunswick","New Jersey","US"
1700,"2004 Charade Rd","98199","Seattle","Washington","US"
1800,"147 Spadina Ave","M5V 2L7","Toronto","Ontario","CA"
1900,"6092 Boxwood St","YSW 9T2","Whitehorse","Yukon","CA"
2000,"40-5-12 Laogianggen","190518","Beijing","","CN"
2100,"1298 Vileparle (E)","490231","Bombay","Maharashtra","IN"
2200,"12-98 Victoria Street","2901","Sydney","New South Wales","AU"
2300,"198 Clementi North","540198","Singapore","","SG"
2400,"8204 Arthur St","","London","","UK"
2500,"Magdalen Centre, The Oxford Science Park","OX9 9ZB","Oxford","Oxford","UK"
2600,"9702 Chester Road","09629850293","Stretford","Manchester","UK"
2700,"Schwanthalerstr. 7031","80925","Munich","Bavaria","DE"
2800,"Rua Frei Caneca 1360 ","01307-002","Sao Paulo","Sao Paulo","BR"
2900,"20 Rue des Corps-Saints","1730","Geneva","Geneve","CH"
3000,"Murtenstrasse 921","3095","Bern","BE","CH"
3100,"Pieter Breughelstraat 837","3029SK","Utrecht","Utrecht","NL"
3200,"Mariano Escobedo 9991","11932","Mexico City","Distrito Federal,","MX"

23 rows selected.

SQL> spool off
SQL>

这就是它的样子 -

如果您可以使用示例 DDL 和数据更新您的问题,我们可以为您提供更好的答案。

免责声明:我是 Oracle 数据库工具的产品经理。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2018-09-26
    • 1970-01-01
    • 2017-05-07
    • 2018-03-24
    相关资源
    最近更新 更多