首页 > 解决方案 > SQL Plus:如何防止数字的自动舍入

问题描述

我需要使用 SQL Plus 将 Oracle db 值拉到 csv 以比较小数点为 10 位的数值。

但数字会自动四舍五入到小数点后 8 位。有什么方法可以禁用 SQLPlus 中的数字舍入。下面找到详细信息。

在此处输入图像描述

这是我的 SQL 集命令。

SET UNDERLINE OFF
SET PAGESIZE 50000
SET NEWPAGE NONE
SET WRAP OFF
SET COLSEP ,     -- SEPARATE COLUMNS WITH A COMMA
SET FEEDBACK OFF
SET TRIMS ON
SET TRIMSPOOL ON
SET DEFINE ON
SET termout ON
SET verify ON
SET linesize 600

有人可以帮我解决这个问题。

标签: oraclesqlplus

解决方案


数值没有任何内在格式,因此您的客户正在决定如何显示它们。我不确定哪个客户端正在生成“DB”值,但 SQL*Plus 只是使用其默认值

SQL*Plus 通常显示数字的位数与准确性所需的位数一样多,最高显示宽度由命令NUMWIDTH变量的值SET(通常为 10)确定。如果一个数字大于 的值SET NUMWIDTH,SQL*Plus 会将数字向上或向下舍入到允许的最大字符数(如果可能),或者如果数字太大则显示散列。

所以你看:

with your_table (x, y) as (
            select -0.0224231886, -0.021470109  from dual
  union all select -0.037164512,  -0.0238026527 from dual
  union all select  0.021786217,   0.044550243  from dual
  union all select  0.0772262609,  0.0724136521 from dual
  union all select  0.968632046,   0.0866250777 from dual
)
select x, y from your_table;

        X,         Y
-.02242319,-.02147011
-.03716451,-.02380265
.021786217,.044550243
.077226261,.072413652
.968632046,.086625078

您可以使用`set numf[ormat]'更改会话的默认值,使用格式模型在小数点前后有足够的数字来表示您可能存储的任何数字,例如:

set numformat 990.99999999999

然后得到相同的查询

              X,              Y
  -0.0224231886,  -0.0214701090
  -0.0371645120,  -0.0238026527
   0.0217862170,   0.0445502430
   0.0772262609,   0.0724136521
   0.9686320460,   0.0866250777

或者您可以使用以下方式隐式修改它set numw[idth]

set numf ""
set numwidth 20

                   X,                   Y
        -.0224231886,         -.021470109
         -.037164512,        -.0238026527
          .021786217,          .044550243
         .0772262609,         .0724136521
          .968632046,         .0866250777

它为您提供所需的精度,但不显示前导零。如果这无关紧要,那么这种方法更简单。


推荐阅读