通过 Command 将 Oracle SQL 导出到 CSV

问题描述 投票:0回答:3

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

文件.sql:

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

文件.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

当我尝试通过串联来修剪空格时,整个事情就会分崩离析(不等的列长度,不应该有的断点等):

修改文件.sql:

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

我在这里做错了什么?我还尝试了其他一些串联方法,例如使用

||'","'||
代替,但这似乎也不起作用。

sql oracle-sqldeveloper sqlplus
3个回答
0
投票

首先确保你已经成功安装sqlplus

.bat 文件

sqlplus SCHEMA_NAME/SCHEMA_PASS@//HOST_IP:PORT/ORACLE_DB_NAME @“D:\ EXPORT_ORACLE_CSV_BATSCRIPT \ EXPORT_ORACLE_CSV_BATSCRIPT.sql”

退出

修改EXPORT_ORACLE_CSV_BATSCRIPT.sql文件 -- 更改csv文件保存路径和文件名 -- 将第一个选择的归档列表替换为您的 CSV HEADER 和最后一列以删除空格 -- 将选择选择的字段列表替换为您的表列名称,我们使用 TEXT 和 =TRIM 进行 csv 数据转换和空白处理

设置行大小 480 设置页面大小 0 设置标题关闭 设置反馈关闭 验证关闭设置长 3000000 线轴 “D:\ EXPORT_ORACLE_CSV_BATSCRIPT \ EXPORT_ORACLE_CSV_BATSCRIPT.csv” 选择“SCNO”,“DISTRIBUTOR_CODE”,= TRIM(“产品代码”)'文本 双重的;选择 '"=TEXT('||a.SCNO||', 0)","'||b.CODE||'",=TRIM("'||c.PRODUCTCODE||'")' 来自 scstatus 的文本 a、分销商 b、cfdb.tblproduct c 其中 1=1 ;

脱机


-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

© www.soinside.com 2019 - 2024. All rights reserved.