spool截断十进制数据

时间:2016-02-18 13:40:37

标签: sql oracle-sqldeveloper

我做了一个非常简单的查询(总结一列):

select 
SUM (txn.amt_val) AS monto
from siebel.s_loy_txn txn 

查询结果是791412524.16但是当我做一个假脱机时,我得到的结果被截断了。

所以:791412524

完整查询是这样的 - >

SET serveroutput ON SIZE 1000000;
SET pages 0;
SET linesize 15000;
SET heading OFF;
SET verify OFF;
SET echo OFF;
SET feedback OFF;
SET term OFF;
SET trims ON;

Spool 'C:\Users\Report.txt' --spoolname from dual;

Select 
SUM (txn.amt_val) AS monto
from siebel.s_loy_txn txn;


SPOOL off

2 个答案:

答案 0 :(得分:0)

也许明确地将数字转换为足够长的char?

select cast(txn.amt_val as char(20)) as monto from siebel.s_loy_txn txn;

答案 1 :(得分:0)

SQL * Plus中的默认numwidth为10.结合默认numformat表示十进制值最多显示十位有效数字;在这种情况下,它会隐式舍入小数,而不是截断。如果您的结果是91412524.16,您会看到91412524.2。

这描述为in the documentation

  

SQL * Plus通常显示的数字与精度所需的位数一样多,最多可达标准显示宽度,该宽度由SET命令的NUMWIDTH变量值(通常为10)决定。如果数字大于SET NUMWIDTH的值,则SQL * Plus会将数字向上或向下舍入到可能的最大字符数,或者如果数字太大则显示哈希值。

......虽然这并不是特别清楚。

你可以让numwidth更大,在这种情况下至少12;或者设置numformat以明确包含小数(可选择fm来抑制前导空格和尾随零);或者使用带有类似面具的to_char();或者作为CZ朱建议你可以施放具有相同效果但不太明显的。

测试所有这些选项:

-- default numwidth and numformat
select 791412524.16 from dual;

set numwidth 11
select 791412524.16 from dual;

set numwidth 12
select 791412524.16 from dual;

set numwidth 10
set numformat fm999999999999999.99999
select 791412524.16 from dual;

set numformat ""
select to_char(791412524.16, 'fm999999999999999.99999') from dual;

select cast(791412524.16 as varchar2(20)) from dual;

获得:

   791412524
 791412524.2
791412524.16
791412524.16
791412524.16
791412524.16

这个问题是为SQL Developer标记的,但是作为你正在使用错误的页面大小,你似乎在使用SQL * Plus。同样的事情也适用于SQL Developer,除了它的默认numformat不太友好,给你7.9E+08。更改numwidth没有帮助,但其他版本也在SQL Developer中获得了全部价值。