SQL和存储过程的结果不一致——小议Oracle的number精度问题
来源:互联网 发布:域名续费便宜 编辑:程序博客网 时间:2024/05/28 15:41
今天看到一个有趣的问题,SQL得到的查询结果和存储过程不一致。
原始问题参加:http://www.itpub.net/showthread.php?s=&threadid=763283
首先模拟一下这个问题:
SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_IN NUMBER, P_OUT OUT NUMBER) IS
2 BEGIN
3 SELECT LOG(2, P_IN) INTO P_OUT FROM DUAL;
4 DBMS_OUTPUT.PUT_LINE(P_OUT);
5 END P_TEST;
6 /
过程已创建。
SQL> SET SERVEROUT ON
SQL> VAR NUM NUMBER
SQL> EXEC P_TEST(4096, :NUM)
11.99999999999999999999999999999999999994
PL/SQL过程已成功完成。
SQL> SELECT LOG(2, 4096) FROM DUAL;
LOG(2,4096)
------------
12
SQL> PRINT NUM
NUM
------------
12
问题似乎很奇怪,为什么存储过程和SQL直接查询得到的结果不一致?其实问题就是由于数据精度造成的。
看看下面几个例子就会明白了:
SQL> SELECT DUMP(LOG(2, 4096)) FROM DUAL;
DUMP(LOG(2,4096))
-------------------------------------------------------------------------------
Typ=2 Len=21: 193,12,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,95
SQL> SELECT TO_CHAR(LOG(2, 4096)) FROM DUAL;
TO_CHAR(LOG(2,4096))
----------------------------------------
11.9999999999999999999999999999999999999
从目前的结果可以看到,Oracle实际上得到并非是12,而是一个近似值。实际上是SQLPLUS工具帮我们做了一个四舍五入。
通过DUMP或转化为字符类型,或者直接在服务器端打印,都会显示正确的结果。
为了避免SQLPLUS的干扰,可以简单的将NUMW设置为40,就可以看到真实的结果:
SQL> SHOW NUMW
numwidth 12
SQL> SET NUMW 40
SQL> SELECT LOG(2, 4096) FROM DUAL;
LOG(2,4096)
----------------------------------------
11.9999999999999999999999999999999999999
LOG函数对精度要求很高,怀疑Oracle中的LOG函数在处理过程中出现了精度不足的问题,因此导致最终的结果不是12。
- SQL和存储过程的结果不一致——小议Oracle的number精度问题
- Oracle和My Sql返回结果集的存储过程
- HQL和SQL查询的结果不一致问题!!!
- 一起ORACLE数据库中数据查询结果不一致问题的排查过程
- 关于oracle 12c SQL语句执行结果与11g不一致的问题
- oracle number数据类型的精度
- Spring 调用ORACLE存储过程的结果
- oracle 返回结果集的存储过程
- Oracle的存储过程返回结果集
- top 和order by导致查询结果不一致的问题
- PL/SQL中单步调试ORACLE存储过程的问题
- 通用的SQL和Oracle的存储过程执行方法
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- [Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集
- Oracle pl/sql编程 25--调用返回结果集的存储过程
- SQL表达式结果集的小数精度
- 关于悬浮框的延迟消失,采用handler的消息机制
- Linux内核Makefile浅析(二)
- 页面打印如何分页
- ADA类型系统(类型兼容性和派生)
- 连续调用tcp_write函数,会导致系统崩溃
- SQL和存储过程的结果不一致——小议Oracle的number精度问题
- Java克隆(Clone)的应用
- dddd
- 悬浮框的显示以及隐藏,有点类似与mediaController
- 让vs编写的程序在未安装vs的电脑上使用的一种方法
- OpenCV学习笔记(三十)——解开VideoInput面纱highgui
- 修复虚拟机 VMnet0:重叠io操作在进行中
- C#聊天机器人
- 内存分配在栈上创建与堆上分配的区别