【问题标题】:Export from Oracle SQL to CSV from Command通过命令从 Oracle SQL 导出到 CSV
【发布时间】:2015-08-02 03:34:55
【问题描述】:

我有一个脚本,通过命令行将数据(包括 CLOB)从 Oracle SQL 导出到 CSV。当我执行脚本然后通过 Python 查看数据时,我得到了每行的正确列数以及正确的数据。但是,每个单元格中都有额外的空格。我的做法:

file.sql

spool "/home/username/file.csv";
SELECT /*csv*/ '"'||COLUMN_1||'"',
'"'||COLUMN_2||'"',
'"'||DBMS_LOB.substr(COLUMN_3,3000)||'"',
        ...
'"'||COLUMN_N||'"'
FROM TABLE; 
spool off; 

file.sh

export ORACLE_SID=MYSID
sqlplus / as sysdba <<EOF
conn myUser/myPass 
set heading off
set termout off 
set trimout off
set newpage none
set pages 0
set feedback off
set echo off
set verify off
set trimspool on
set sqlprompt "" 
set colsep ","
set linesize 32767      
@/home/username/file.sql
exit
EOF

当我尝试通过连接来修剪空格时,整个事情都崩溃了(不等的列长度、不应该存在的断点等):

修改后的file.sql

spool "/home/username/file.csv";
SELECT /*csv*/ '"'||COLUMN_1||'"'||','
'"'||COLUMN_2||'"'||','
'"'||DBMS_LOB.substr(COLUMN_3,3000)||'"'||','
        ...
'"'||COLUMN_N||'"'
FROM TABLE; 
spool off;

我在这里做错了什么?我还尝试了其他一些连接方法,例如改用||'","'||,但这似乎也不起作用。

【问题讨论】:

  • 您检查过数据中的空格吗?尝试在列周围添加 TRIM()。
  • 数据中没有空格,TRIM() 似乎不起作用。需要明确的是,我的输出如下所示: "VALUE" /s/s/s/s/s/s/s/s/s/s,"VALUE2"/s/s/s/s/s/s/ s/s/s/s/s , /s/s/s/s/s/s/s"VALUE3" /s/s/s/s/s/s/s/. "" 内的输出没问题。
  • 忽略我上面的评论,看看我发布的答案。

标签: sql oracle-sqldeveloper sqlplus


【解决方案1】:

怎么样:

select col1 || ',' || col2 || ',' || col3 from tab1;

select '"' || col1 || '",' || '"' || col2 || '",' || '"' || finalcol || '"'  from tab1;

例如

SQL> select '"' || AD_ID || '",' || '"' || AD_SOURCETEXT || '",' || '"' || PRODUCT_ID || '"'  from pm.print_media where rownum < 4;

'"'||AD_ID||'",'||'"'||AD_SOURCETEXT||'",'||'"'||PRODUCT_ID||'"'
--------------------------------------------------------------------------------
"11001","TIGER2 Mousepad
Product Number: 2056   Price:  $8    Today's Sale Price

"12001","TIGER2 Mousepad
Product Number: 2056   Price:  $8    Today's Sale Price

"13001","TIGER2 3106 Keyboard
Product Number: 3106
* KB 101/EN keyboard is a sta

【讨论】:

    【解决方案2】:

    看看这个:来自这个帖子:https://community.oracle.com/thread/2357292

    为每个选定的列指定一个别名。然后它对我有用。

    SELECT /*csv*/ '"'||COLUMN_1||'"' COL1,
    '"'||COLUMN_2||'"'                COL2,
    '"'||DBMS_LOB.substr(COLUMN_3,3000)||'"' COL3,
            ...
    '"'||COLUMN_N||'"' COLN
    FROM TABLE; 
    

    编辑:添加了我在 Toad 中运行的示例。

    在 Toad 中,我运行这个:

    set heading off
    set termout off 
    set trimout off
    set newpage none
    set pages 0
    set feedback off
    set echo off
    set verify off
    set trimspool on
    set trimout on
    set tab off
    set sqlprompt "" 
    set colsep ","
    set linesize 32767      
    
    spool c:\temp\efs.txt;
    
    SELECT '"'||'A'||'"',
    '"'||'B'||'"',
    '"'||'C'||'"'
    FROM dual; 
    
    spool off;
    

    然后得到:

    "A"          ,"B"          ,"C"
    

    当我添加列别名时:

    SELECT '"'||'A'||'"' a,
    '"'||'B'||'"' b,
    '"'||'C'||'"' c
    FROM dual; 
    

    我明白了:

    "A","B","C"
    

    请参阅此线程以获取另一种方法和说明(我们就是这样做的):https://community.oracle.com/thread/1081068

    【讨论】:

    • 这似乎对我也不起作用。我试试||'","||接下来是别名。老实说,我总是可以在 Python 中修剪单元格——我只是更喜欢在 SQL 中有一个适当的解决方案。
    • 从双重标题中选择时,我得到的结果与您相同,但是一旦我从 TABLE 中选择,它对我不起作用。 :-(
    • 好吧,我会的!同样在这里。啊,我会按照我帖子中的最后一个链接并这样做。这就是我们在这里的做法,在我以前的工作中也是如此。
    • 我在这里拉头发!哈哈。我尝试先从双重中选择,然后使用您的方法从表中选择,这实际上有效,但现在我只能从超过 100k 的总数中取回 20 行。
    • 我想我会在 Python 中去掉那些该死的单元格。单元格.strip()。完成。
    猜你喜欢
    • 2014-09-29
    • 2022-11-04
    • 2013-07-02
    • 2015-06-11
    • 1970-01-01
    • 2021-08-04
    • 2011-09-30
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多