Oracle 使用BASH脚本假脱机CSV文件|错误,输出为生成的CSV
我需要将表的输出从db假脱机到CSV文件。 我检查并参考了 但它没有成功。我得到的只是前3列被Oracle 使用BASH脚本假脱机CSV文件|错误,输出为生成的CSV,oracle,bash,shell,csv,sqlplus,Oracle,Bash,Shell,Csv,Sqlplus,我需要将表的输出从db假脱机到CSV文件。 我检查并参考了 但它没有成功。我得到的只是前3列被,隔开,而不是剩下的。其他人被新线分开了 编辑:正在假脱机的表的架构详细信息。 WWID VARCHAR2 (5 Byte) TIMELOG_DATE DATE TOTAL_HOURS NUMBER (10,2) ACTIVITY VARCHAR2 (100 Byte) SUBACTIVITY VARCHAR
,
隔开,而不是剩下的。其他人被新线分开了
编辑:正在假脱机的表的架构详细信息。
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)
脚本:
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}
也就是说,值之间用换行符分隔(在写字板中看到时)
感谢删除行大小为80个字符,因此默认情况下,当超过该长度时,列将换行。您的100字节列将导致这种行为。您可以添加SQL*Plus命令来更改:
-- any number at least as large as the longest possible output
set linesize 1024
set wrap off
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;
这将删除当前将所有CSV行填充为相同长度的额外空白,并减少输出文件的大小。然后,输出是一列,因此
colsep
设置不再相关。您可能只需要将行大小设置得更高,和/或设置换行;但是表结构是什么ize是要包装的列吗?您真的希望空白填充字符串值吗?好的,我正在用表结构编辑说明。在这里,,
分隔符更改为换行符的部分是声明为数字(10,2)
(在输出中显示值8
,如描述中所示)在任何生产环境中编辑架构详细信息select*
都是一个坏主意。这只是为了调试champ。谢谢:-)它成功了。谢谢。关于使用select*
,它只是为了调试。非常感谢:-@Sachin-谢谢RR
是一个有效的日期模型,但如果你真的想要两位数的年份,我想YY
对于输出也是一样好的。是的。我更改了它,因为50-99存储为1950-1999,00-49结束的日期存储为2000-2049。我正在为1919年以来的老公司开发一个企业应用程序,因此有很多数据需要迁移。就在这种情况下;-)谢谢,我再打扰你一件事。实际上,我的列输出列表中有很多空格。e、 g.iv315,31-DEC-14,8,假人,参考文献01,CPRM型新参考项目,66,NA
。。。。。根据列定义,正在根据剩余字符添加相同的数字空格。。。除以外的任何解决方案从tablename中选择trim(col1)、trim(col2)、trim(col3)
。。。由于多次调用trim()
函数会降低性能。@Sachin-trim对依赖colsep的用户没有帮助;这就是为什么我更喜欢连接。
select wwid
||','|| to_char(timelog_date, 'DD-MON-YY') -- or another format
||','|| total_hours
||','|| activity
||','|| subactivity
... -- etc
from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;