楼主: guoyJoe

[精华] 明明白白使用数据块 ----数据块格式深入解析

[复制链接]
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
61#
 楼主| 发表于 2013-3-19 20:08 | 只看该作者
semiter 发表于 2013-3-19 20:07
还是要支持一下

谢谢支持!

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
62#
 楼主| 发表于 2013-3-19 20:09 | 只看该作者
paynefu 发表于 2013-3-19 19:37

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
63#
 楼主| 发表于 2013-3-19 20:09 | 只看该作者
awxsf 发表于 2013-3-19 00:15
不错, 赞一个!

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
64#
 楼主| 发表于 2013-3-19 20:09 | 只看该作者
tianleifei 发表于 2013-3-19 09:46
跟着学习

一起学习!

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
65#
 楼主| 发表于 2013-3-19 20:10 | 只看该作者
leo0087 发表于 2013-3-19 10:22
分析的很不错哦~~

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
66#
 楼主| 发表于 2013-3-19 20:10 | 只看该作者
nt_levi 发表于 2013-3-19 10:53
谢谢楼主分享

不客气!

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
67#
 楼主| 发表于 2013-3-19 20:10 | 只看该作者
neves_0 发表于 2013-3-19 10:57
郭大侠,拜读了。

谢谢支持!

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
68#
 楼主| 发表于 2013-3-19 20:10 | 只看该作者
appleman1983 发表于 2013-3-19 13:09
谢谢分享!~

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
69#
 楼主| 发表于 2013-3-19 20:11 | 只看该作者
MACSKEY 发表于 2013-3-19 13:44
讲解深入值得学习品味

继续出精品!

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
70#
 楼主| 发表于 2013-3-20 06:48 | 只看该作者
本帖最后由 guoyJoe 于 2013-3-20 08:46 编辑

我们来看一下NUMBER类型的转储

col  0: [ 2]  c2 02 数字100转存后是这样
SQL> select (to_number('2','xxxx')-1)*power(100,to_number('c2','xxxx')-193) from dual;

(TO_NUMBER('2','XXXX')-1)*POWE
------------------------------
                           100
这样就算回去了


数字-123.333 转存后是
col  0: [ 6]  3d 64 59 59 47 66
select -((101 - to_number('64', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx')) +
       (101 - to_number('59', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx') - 1) +
       (101 - to_number('59', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx') - 2) +
       (101 - to_number('47', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx') - 3) )

这样就算回去了

转存后是16进制的
要 改回10进制
创建一个表
SQL> create table t1
  2  (it number);

Table created

SQL> insert into t1
  2  values(100);

1 row inserted

计算器块
SQL> select rowid from t1;

ROWID
------------------
AAAXKYAABAAAU4aAAA

SQL> select dbms_rowid.rowid_relative_fno('AAAXKYAABAAAU4aAAA'),dbms_rowid.rowid_block_number('AAAXKYAABAAAU4aAAA') from t1;

DBMS_ROWID.ROWID_RELATIVE_FNO( DBMS_ROWID.ROWID_BLOCK_NUMBER(
------------------------------ ------------------------------
                             1                          85530
进行DUMP
SQL> alter system dump datafile 1 block 85530;

System altered
查看其数字的dump格式
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9a
avsp=0x1f83
tosp=0x1f83
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0x1f9a
block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c2 02  ----这里就是DUMP出来的,长度是2
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 85530 maxblk 85530
其实这里的C2 02就是其具体的数字。使用DUMP函数也能得出
SQL> select dump(it,16) from t1;

DUMP(IT,16)
--------------------------------------------------------------------------------
Typ=2 Len=2: c2,2

然后通过ORACLE的算法计算回去

SQL> select to_number('c2','xxxx') from dual;

TO_NUMBER('C2','XXXX')
----------------------
                   194

SQL> select to_number('2','xxxx') from dual;

TO_NUMBER('2','XXXX')
---------------------
                    2
其实这里的如果换算为10进制是
194,2
如果大于128 就是正数,小于128就是负数
指数是194-193=1
数字位1 是2-1=1*100^(1-0)=100 -1是因为正数+1存储
所以数字也就还原为100
SQL> select (to_number('2','xxxx')-1)*power(100,to_number('c2','xxxx')-193) from dual;

(TO_NUMBER('2','XXXX')-1)*POWE
------------------------------
                           100
用SQL就是这样,这是第一位

在加入一个负数
SQL> insert into test
  2  values(-123.333);

1 row inserted

SQL> commit;

Commit complete

进行DUMP如上
tab 0, row 1, @0x1f90
tl: 10 fb: --H-FL-- lb: 0x2  cc: 1
col  0: [ 6]  3d 64 59 59 47 66
进行计算
Typ=2 Len=6: 3d,64,59,59,47,66
SQL> select dump(it,16) from testpp;

DUMP(IT,16)
--------------------------------------------------------------------------------
Typ=2 Len=2: c2,2
Typ=2 Len=6: 3d,64,59,59,47,66  --66 及10进制的102是一个排序位不用理会,用在负数的时候
内部存储长度6 指数3d 后面数数字位
换算为10进制就是
61,100,89,89,71,102
61是指数未
102 是排序位
中间的数字位

select -((101 - to_number('64', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx')) +
       (101 - to_number('59', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx') - 1) +
       (101 - to_number('59', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx') - 2) +
       (101 - to_number('47', 'xxxx')) *
       power(100, 62 - to_number('3d', 'xxxx') - 3) )
  from dual;
这样数字就完成了转换。



使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表