暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle CSV脚本在12c上工作得很好,但是在19c上,结果是不同的- -在值之前和值之后都添加了空格!

askTom 2021-09-20
1554

问题描述

大家好,
这是第一次发邮件。
我们在19c中遇到了一个问题,当生成一个csv文件。
在12c中,结果与预期一致。
空格将添加在列内容之后或之前。
请查收附件中有关环境的信息。

--表结构
列名类型TABLE
--------------------------------------------
代码_允许EEULL字符(六)出口。inv_池_prod_tmp
HITTO_日期_VALORISING编号(6) GP2PROD.gestion_valoration

--转换日期函数
CREATE FUNCTION "GP2PROD"."CONVERTION_DATE" (cd_date number) 
return date is cd_date2 date;
BEGIN
cd_date2 := TO_DATE('14/09/1752','DD/MM/YYYY') + abs(cd_date);
return (cd_date2);
END;
复制


--脚本
set heading off pagesize 0 linesize 0
set TRIMSPOOL ON
set RECSEP off
set verify off

CREATE TABLE inv_pool_prod_tmp as
select distinct dp.code_portefeuille
from descriptif_comp_portefeuille dcp,
     descriptif_portefeuille dp,
     contenu_ensemble_port cep
where dcp.flag_pool <> ' '
and   dcp.code_portefeuille =  dp.code_portefeuille
and   dp.objectif_portefeuille <> ' '
and   cep.code_portefeuille =dp.code_portefeuille
and   cep.code_ensemble_port <> 'OPCLIQ'
group by dp.code_portefeuille
order by dp.code_portefeuille;

spool $GPFETAT/ctrl_nbr_pool_prod.csv
select B.CODE_PORTEFEUILLE, ';',
       convertion_date(max(B.HISTO_DATE_VALORISATION)) as premiere_valo
from inv_pool_prod_tmp a,
     gestion_valorisation b
where a.code_portefeuille = b.code_portefeuille
group by b.code_portefeuille
order by b.code_portefeuille;
spool off;
quit;
复制


--如您所见,在第一列中添加值之后,在第二列中添加值之前。
more ctrl_nbr_pool_prod.csv
复制

100801;2014年12月31日
100804;2014年12月31日
100805;2014年12月31日
100806;2014年12月31日
100809;2014年12月31日
100810;2014年12月31日
100811;2016年6月14日
100812;2016年6月14日
100813;2016年6月14日
100814;2016年6月14日
100815;2016年6月30日
100816;2016年6月30日
100817;2017年6月1日
126401;2017年11月10日

提前感谢您的答复。


专家解答

这将取决于您的客户端的格式设置。但不管原因是什么,现在有更好的方法来处理分隔数据。

SQL*Plus和SQLcl都支持将结果作为分隔文本返回。只需将适当的设置添加到脚本

SQL*Plus

你想要set markup csv命令:

SQL> set markup csv on delimiter ; quote on
SQL> set heading off pagesize 0 linesize 1
SQL> set trimspool on
SQL> set verify off
SQL>
SQL> select codep, cvdate(datev) as p
  2  from   test;
"100801";"31-DEC-14"
"100804";"31-DEC-14"
"100805";"31-DEC-14"
"100806";"31-DEC-14"
"100809";"31-DEC-14"
"100810";"31-DEC-14"
"100811";"14-JUN-16"
"100812";"14-JUN-16"
"100813";"14-JUN-16"
"100814";"14-JUN-16"
复制


SQLcl/SQL Developer

使用set sqlformat delimited选项:

SQL> set sqlformat delimited ; " "
SQL> set heading off pagesize 0 linesize 1
SQL> set trimspool on
SQL> set verify off
SQL>
SQL> SELECT codep, cvdate(datev) as p
  2  from   test;

"100801";31-DEC-14
"100804";31-DEC-14
"100805";31-DEC-14
"100806";31-DEC-14
"100809";31-DEC-14
"100810";31-DEC-14
"100811";14-JUN-16
"100812";14-JUN-16
"100813";14-JUN-16
"100814";14-JUN-16

10 rows selected.
复制


在进行此操作时,请确保您同时:

-设置会话的NLS_date_格式
- TO_CHAR输出中的任何日期/时间戳列

否则,如果您在另一台机器上运行脚本,您就会面临日期更改格式的风险!
文章转载自askTom,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论