Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用BASH脚本假脱机CSV文件|错误,输出为生成的CSV_Oracle_Bash_Shell_Csv_Sqlplus - Fatal编程技术网

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

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

我需要将表的输出从db假脱机到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)
脚本:

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;