`
cargoj
  • 浏览: 59198 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

NUMBER Oracle内部存储

阅读更多

from : http://www.eygle.com/archives/2005/12/how_oracle_stor.html


我们可以通过DUMP函数来转换数字的存储形式,一个简单的输出类似如下格式:

SQL> select dump(1) from dual;
DUMP(1)
------------------
Typ=2 Len=2: 193,2

DUMP函数的输出格式类似:

类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,......,数字20]

各位的含义如下:

1.类型: Number型,Type=2 (类型代码可以从Oracle的文档上查到)

2.长度:指存储的字节数

3.符号/指数位

在存储上,Oracle对正数和负数分别进行存储转换:

正数:加1存储(为了避免Null)
负数:被101减,如果总长度小于21个字节,最后加一个102(是为了排序的需要)

指数位换算:

正数:指数=符号/指数位 - 193 (最高位为1是代表正数)
负数:指数=62 - 第一字节

4.从<数字1>开始是有效的数据位

从<数字1>开始是最高有效位,所存储的数值计算方法为:

将下面计算的结果加起来:

每个<数字位>乘以100^(指数-N) (N是有效位数的顺序位,第一个有效位的N=0)

5. 举例说明

 

SQL> select dump(123456.789) from dual;
DUMP(123456.789)
-------------------------------
Typ=2 Len=6: 195,13,35,57,79,91

<指数>:   195 - 193 = 2
<数字1>    13 - 1    = 12 *100^(2-0) 120000
<数字2>    35 - 1    = 34 *100^(2-1) 3400
<数字3>    57 - 1    = 56 *100^(2-2) 56
<数字4>    79 - 1    = 78 *100^(2-3) .78
<数字5>    91 - 1    = 90 *100^(2-4) .009
                            123456.789

 

SQL> select dump(-123456.789) from dual;
DUMP(-123456.789)
----------------------------------
Typ=2 Len=7: 60,89,67,45,23,11,102

<指数>     62 - 60 = 2(最高位是0,代表为负数)
<数字1> 101 - 89 = 12 *100^(2-0) 120000
<数字2> 101 - 67 = 34 *100^(2-1) 3400
<数字3> 101 - 45 = 56 *100^(2-2) 56
<数字4> 101 - 23 = 78 *100^(2-3) .78
<数字5> 101 - 11 = 90 *100^(2-4) .009
                              123456.789(-)

现在再考虑一下为什么在最后加102是为了排序的需要,-123456.789在数据库中实际存储为

60,89,67,45,23,11

而-123456.78901在数据库中实际存储为

60,89,67,45,23,11,91

可见,如果不在最后加上102,在排序时会出现-123456.789<-123456.78901的情况。

对于2119号提问,第一个问题是:

1.请问为什么193,2各代表什么意思?

从上面就可以看到答案了.

2.还有NUMBER数字类型为什么有2个字节的长度呢?

对于这个问题,我想我们应该知道,所有数据类型最终在计算机里都以二进制存储,实际上所谓的数据类型都是我们定义的.所以存储只由算法决定.

所以这个问题是不成立的.比如:

 

SQL> select dump(110) from dual;
DUMP(110)
---------------------
Typ=2 Len=3: 194,2,11
SQL> select dump(1100) from dual;
DUMP(1100)
-------------------
Typ=2 Len=2: 194,12

我们会看到,虽然1100>110,但是存储上1100却只占2字节,而110却占了3个字节.

分享到:
评论

相关推荐

    oracle的存储过程如何返回结果集

    当存储过程被调用时,它可以在内部执行SQL查询,并将结果存储在一个Ref Cursor中,然后将这个Ref Cursor作为输出参数返回给调用者。 #### 三、创建存储过程返回结果集 ##### 1. 过程返回记录集 下面是一个简单的...

    oracle内部培训教材(来自传智播客学员)

    这份"oracle内部培训教材"源自知名教育机构传智播客的学员资源,旨在帮助学习者深入理解Oracle数据库系统的核心概念、管理和优化技术。 一、Oracle数据库基础 Oracle数据库是一个关系型数据库管理系统(RDBMS),它...

    Oracle基本数据类型存储格式浅析

    LONG类型用于存储大段文本,但其DUMP函数不支持,需要借助ALTER SYSTEM DUMP BLOCK来查看其内部结构。 其次,数字类型在Oracle中包括NUMBER、INTEGER、SMALLINT等。NUMBER类型可以存储非常大的数值,并具有极高的...

    Oracle公司内部培训教材(合集)

    这份“Oracle公司内部培训教材(合集)”包含了从Les01到Les10的10个PPT文件,旨在为学习者提供深入的Oracle技术知识。 首先,让我们逐一解析这些课程的关键知识点: 1. **Les01_chinese.ppt - Oracle基础** 这...

    Oracle 分页存储过程

    在这个存储过程中,我们首先创建一个内部子查询,其中包含所有满足条件的记录并按照排序列进行排序。然后,外层的子查询只选取ROWNUM小于或等于总页数乘以每页记录数的行,这样就避免了处理超出实际需要的额外行。...

    Oracle内部培训课件

    这份"Oracle内部培训课件"为初学者提供了一个从入门到进阶的学习路径,涵盖了Oracle数据库的基础概念、安装配置、SQL语言、数据管理、备份恢复等多个方面。下面将详细阐述这些知识点。 1. Oracle基础: - 数据库...

    oracle存储过程学习资料

    存储过程内部可以包含PL/SQL块,包括声明部分(DECLARE)、执行部分(BEGIN...END)和异常处理部分(EXCEPTION)。这使得存储过程可以处理更复杂的逻辑和数据操作。 5. **游标和循环**: 在存储过程中,可以使用...

    Oracle 内部培训资料

    讲解了Oracle支持的数据类型,如NUMBER、VARCHAR2、DATE等,以及算术、比较和逻辑运算符,为编写PL/SQL代码打下基础。 5. **Les05_chinese.ppt** - 表的创建与管理 这部分可能包含如何创建、修改和删除表的语法,...

    oracle存储过程语法

    在PL/SQL块中,可以声明局部变量,如`VARCHAR2`, `NUMBER`等类型的变量,用于存储中间计算结果或控制流程。 4. **流程控制**: - `IF-THEN-ELSIF-ELSE`结构用于条件判断,可以根据不同条件执行不同分支。 - `...

    oracle_存储过程的基本语法_及注意事项

    Oracle存储过程是一种预编译的SQL脚本集合,它可以包含复杂的逻辑控制结构,如条件语句、循环等,并且可以在数据库内部执行,从而提高性能并简化应用程序的开发工作。存储过程支持多种变量类型,包括数字、字符串和...

    oracle存储过程学习经典[语法+实例+调用]

    Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一系列复杂的SQL和PL/SQL语句,形成可重用的代码模块。Oracle存储过程的学习涵盖了语法、实例和调用等多个方面,这对于数据库管理员和开发...

    Oracle 存储过程异常处理.docx

    PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number); 例如: DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN -- Some operation that causes an ORA-...

    Oracle Number型数值存储与转换的实现详解

    在Oracle中,Number型数值的存储和转换涉及到一系列内部算法,这些算法确保了数值的精确存储和计算。 1. **Number型数值存储机制**: Oracle将Number型数值以二进制形式存储,包括一个符号位、一个指数部分和有效...

    oracle函数调用存储过程

    有时候,为了更好地组织代码和提高复用性,我们可能会考虑在函数内部调用一个存储过程。这种做法可以有效地分离关注点,使得程序更加模块化、易于维护。 #### 存储过程与函数概述 在Oracle数据库中,**存储过程**...

    oracle内部讲义36.pptx

    在"Oracle内部讲义36.pptx"中,我们主要探讨了SQL中的函数,特别是单行函数,这些函数对于数据查询和处理至关重要。 首先,我们要了解SQL函数的基本结构,它们通常包含函数名称和一个或多个参数,函数接收这些参数...

    oracle存储过程通用分页

    Oracle存储过程是数据库管理系统Oracle中实现复杂业务逻辑的重要工具,它可以封装一系列SQL语句和PL/SQL代码,形成可重复使用的程序单元。在处理大量数据时,为了提高性能和用户体验,通常会采用分页查询的方式来...

    达内培训内部资料oracle讲义

    达内培训内部的Oracle讲义深入浅出地介绍了Oracle数据库的核心概念和技术,旨在帮助学习者掌握Oracle数据库管理、开发和优化的基本技能。 一、Oracle数据库基础 Oracle数据库系统基于SQL语言,它支持事务处理、数据...

    oracle 存储过程分页示例

    Oracle存储过程是数据库管理系统中的一种重要编程元素,用于封装一系列SQL语句和PL/SQL代码,以实现特定的业务逻辑或功能。在大型数据库应用中,分页查询是常见的需求,尤其是在展示大量数据时,避免一次性加载所有...

    Oracle公司内部数据库培训资料

    Oracle公司内部数据库培训资料是一份深入讲解Oracle数据库的宝贵资源,专为Oracle内部人员设计,旨在提供针对性强、实用性强的教育内容。这份资料涵盖了Oracle数据库的基础知识到高级特性的全面解析,对于想要深入...

Global site tag (gtag.js) - Google Analytics