使用 BASH 脚本假脱机 CSV 文件 | 生成的 CSV 中的输出错误

Sac*_*hin 3 csv oracle bash shell sqlplus

我需要将表的输出从 db 假脱机到CSV文件。我检查并参考了如何使用 SQLPLUS 假脱机到 CSV 格式的文件?

但它没有成功。我得到的只是前 3 列被分隔,而不是其余列。其他人被换行符分开。

编辑:正在假脱机的表的架构详细信息。

WWID               VARCHAR2 (5 Byte) 
TIMELOG_DATE       DATE 
TOTAL_HOURS        NUMBER (10,2) 
ACTIVITY           VARCHAR2 (100 Byte) 
SUBACTIVITY        VARCHAR2 (100 Byte) 
REF_PROJECT_ID     VARCHAR2 (30 Byte) 
REF_PROJECT_DESC   VARCHAR2 (250 Byte)
WORK_REQUEST_ID    VARCHAR2 (30 Byte)
EMP_COMMENTS       VARCHAR2 (100 Byte)
APPROVER_COMMENTS  VARCHAR2 (100 Byte)
Run Code Online (Sandbox Code Playgroud)

脚本:

echo "\n>>> ******Data Processing Started at `date '+%d-%m-%Y %T %Z'`******" >>${LOGFILE}

sqlplus $fims_user/$fims_pwd << EOF
set serveroutput on;
set colsep ,     ;-- separate columns with a comma
set pagesize 0   ;-- No header rows
set trimspool on ;-- remove trailing blanks
set headsep off  ;-- this may be useful...depends on your headings.

spool /home/fimsctl/datafiles/outbound/timelog/timelog_file_`date +%y%m%d`.csv

select * from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;

commit;
spool off
exit
EOF

echo "\n>>> ******Data Load Completed at `date '+%d-%m-%Y %T %Z'`******" >>${LOGFILE}

echo "End of the script">> ${LOGFILE}
Run Code Online (Sandbox Code Playgroud)

在CSV输出我得到的是:

SQL> select * from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
iv315,29-DEC-14,          8
DUMMY

REF01
New Ref Project of type CPRM
66
NA


iv315,30-DEC-14,          8
DUMMY

REF01
New Ref Project of type CPRM
66
NA


iv315,31-DEC-14,          8
DUMMY

REF01
New Ref Project of type CPRM
66
NA
Run Code Online (Sandbox Code Playgroud)

那就是值然后用换行符分隔(在写字板中看到时)

谢谢

Ale*_*ole 5

默认行大小为 80 个字符,因此默认情况下,当超过该长度时,列将换行到新行。您的 100 字节列将导致该行为。您可以添加 SQL*Plus 命令来更改它:

-- any number at least as large as the longest possible output
set linesize 1024
set wrap off
Run Code Online (Sandbox Code Playgroud)

select *通常会皱眉,因为如果表定义更改 - 即添加列 - 或者如果表在不同环境中具有不同顺序的列,输出可能会意外更改。(可以说,源代码控制不应该发生这种情况,只要您不使用 ,通常就没有关系*。如果您明确列出所需的列,将它们与手动添加的分隔符连接起来并没有太多额外的工作,例如:

select wwid
  ||','|| to_char(timelog_date, 'DD-MON-YY') -- or another format
  ||','|| total_hours
  ||','|| activity
  ||','|| subactivity
  ... -- etc
from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
Run Code Online (Sandbox Code Playgroud)

这将删除当前将所有 CSV 行填充为相同长度的额外空白,并减小输出文件大小。然后输出是单列,因此colsep设置不再相关。