- 浏览: 12302068 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
笨蛋咯:
获取不到信息?
C#枚举硬件设备 -
guokaiwhu:
能把plan的数据结构图画出来,博主的耐心和细致令人佩服。
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree -
gao807877817:
学习
BitmapFactory.Options详解 -
GB654:
楼主,我想问一下,如何在创建PPT时插入备注信息,虽然可以解析 ...
java转换ppt,ppt转成图片,获取备注,获取文本 -
jpsb:
多谢 ,不过我照搬你的sql查不到,去掉utl_raw.cas ...
关于oracle中clob字段查询的问题
明明白白使用数据块 ----数据块格式深入解析
buffer tsn: 7 rdba: 0x01800087 (6/135)
scn: 0x0000.0015a3eb seq: 0x01 flg: 0x06 tail: 0xa3eb0601frmt: 0x02 chkval: 0xec19 type: 0x06=trans data
|
Block header dump:0x01800087
Object id on Block? Y
seg/obj: 0x12cbbcsc:
0x00.15a3eaitc: 2flg:
Etyp: 1 - DATA
brn: 0bdba: 0x1800080 ver: 0x01 opc: 0
inc: 0exflg: 0
|
Itl Xid Uba FlagLck Scn/Fsc
0x010x0004.00f.00000346 0x00c00793.00bb.22 --U- 1 fsc 0x0000.0015a3eb
0x020x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
|
bdba: 0x01800087
data_block_dump,data header at 0x2b70e9566a64
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x2b70e9566a64
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f8c
avsp=0x1f78
tosp=0x1f78
0xe:pti[0] nrow=1offs=0
0x12:pri[0] offs=0x1f8c
|
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x1cc: 2
col0: [ 2]c1 02
col1: [ 5]41 41 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 135 maxblk 135
|
5、下面对这些数据用SQL语句做相互转换
(1)把表中的数据转成16进制(即在ORACLE内部数据块看到的数据),用以下sql语句:
ID NAME DUMP(01,'16') DUMP('AAAAA','16')
---- ---------- ----------------- ----------------------------
1 AAAAA Typ=2 Len=2: c1,2 Typ=96 Len=5: 41,41,41,41,41
(2)反过来把16进制转成表中的数据(当然我这边的数据类型只考虑了number和varchar类型),用以sql下语句:
ggyj@OCM> col id for 999gyj@OCM> col id1 for 999
gyj@OCM> col name for a10
gyj@OCM> col name1 for a10
gyj@OCM> select id,UTL_RAW.CAST_TO_NUMBER(replace(' c1 02 ',' ')) id1,
2name,UTL_RAW.CAST_TO_VARCHAR2(replace('41 41 41 41 41',' ')) name1
3from t1;
IDID1 NAME NAME1
---- ---- ---------- ----------
1 1 AAAAA AAAAA
****************************************************************************************************************************************************************************
0x2 (数据块延迟清洗推进scn和seq)
0X04(设置校验和)
0x08(临时块)
对于 flg标志的值是由上面一些位做组合运算的,下面我们来看几下例子:
1、先来看看0x01 (新建块)和0X04(设置校验和) 的组合
我的版本是11gr2
gyj@OCM> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
由于11gr2在创建表的时侯有个延迟段参数的控制,默认不分配EXTNETS空间
gyj@OCM> show show parameter deferred_segment_creation
showmode OFF
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
那么我在建表的同时要立马分配EXTENTS,好我马上建个表,操作如下:
gyj@OCM> create table t20(id int ,name varchar2(10)) SEGMENT CREATION IMMEDIATE;
Table created.
查分配的区号,文件号,块号
gyj@OCM> select extent_id,file_id,block_id from dba_extents where segment_name='T20';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 3 152
对3号文件的152号块做DUMP,做dump时最好新打会一个会话,避免产生不必要的日志,操作如下
[oracle@ocm ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 18 07:40:55 2013
Copyright (c) 1982, 2009, Oracle.All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
sys@OCM> alter system dump datafile 3 block 152;
System altered.
好,现在马上到找到跟踪日志
sys@OCM> show parameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/trace
core_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/trace
[oracle@ocm trace]$ cd /u01/app/oracle/diag/rdbms/ocm/ocm/trace
[oracle@ocm trace]$ ls -lFtr
[oracle@ocm trace]$ more ocm_ora_12910.trc
贴出数据块头的信息:
scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001
frmt: 0x02 chkval: 0xa798 type: 0x00=unknown
从上面看出flg是flg: 0x05,就是0x01 +0x04的组合,
0x01说明这是一个新建的块,因为我的表的是刚刚创建的,没有向块中插入数据。
0x04说明有设置校验,chkval: 0xa798这个就是校验和,这个与参数db_block_checksum有关
gyj@OCM> show parameter db_block_checksum
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_checksum string TYPICAL
默认设置了db_block_checksum,就会启动校验和检查数据块的一致性。另外数据块尾部的4个字节也是配合数据块头来验证数据块的一致性。
如果一个块头被标识成软损坏,那么块头的序列号为0xff,标志为0x00
2、再来看0x2 (数据块延迟清洗推进scn和seq)
对于延迟块清洗推进要细说有点复杂,到时候对这一块开个专题,这里我就简单介绍一下。
在11g版本中,对数据DML操作,Oracle都是采取快速提交,在事务槽中可以观察到,OK,我先来做个测试来验证一下:
先插入一条数,然后提交,再dump,操作如下:
gyj@OCM> insert into t1 values(2,'BBBBB');
1 row created.
gyj@OCM> commit;
Commit complete.
gyj@OCM> alter system flush buffer_cache;
System altered.
gyj@OCM> gyj@OCM> select id,name,dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from t1 where id=2;
ID NAME DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
---- ---------- ------------------------------------ ------------------------------------
2 BBBBB 3 132
sys@OCM> alter system dump datafile 3 block 132;
System altered.
dump 的内容如下:注意看下面的红色字体部分
数据块头
buffer tsn: 7 rdba: 0x00c00084 (3/132)
scn: 0x0000.004bb8d3 seq: 0x02flg: 0x06tail:0xb8d30602
frmt: 0x02 chkval: 0x6a0c type:0x06=trans data
事务ITL
Object id on Block? Y
seg/obj: 0x12723csc: 0x00.4bb8d1itc: 2 flg: Etyp: 1 - DATA
brn: 0bdba:0xc00080 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba FlagLck Scn/Fsc
0x01 0x0008.016.00001131 0x018019a3.0160.16--U- 1fsc 0x0000.004bb8d3
0x02 0x0003.013.0000107a 0x018017c7.0128.23C--- 0scn 0x0000.004bb60d
数据部分
bdba: 0x00c00084
data_block_dump,data header at0x827664
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x00827664
76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f75
avsp=0x1f5d
tosp=0x1f5d
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f8c
0x14:pri[1] offs=0x1f81
0x16:pri[2] offs=0x1f75
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x0cc:2
col0: [ 2]c1 02
col1: [ 5]41 41 41 41 41
tab 0, row 1, @0x1f81
tl: 11 fb: --H-FL-- lb: 0x0cc:2
col0: [ 2]c1 02
col1: [ 4]67 79 6a 31
tab 0, row 2, @0x1f75
tl: 12 fb: --H-FL-- lb: 0x1cc:2
col0: [ 2]c1 03
col1: [ 5]42 42 42 42 42
end_of_block_dump
即
gyj@OCM> insert into t1 values(2,'BBBBB');
1 row created.
gyj@OCM> commit;
实际上很容易看出,从上面的数据看出
tab 0, row 2, @0x1f75
tl: 12 fb: --H-FL-- lb: 0x1 cc: 2 ---lb: 0x1对应的就是事务槽的1号槽。
col 0: [ 2] c1 03
col 1: [ 5] 42 42 42 42 42 ----16进制42就是B
那么什么时候会把提交标记U变成C呢,当我再修改另一行记录时,Oracle向0x02 0x0003.013.0000107a 0x018017c7.0128.23 C--- 0 scn 0x0000.004bb60d2号事务槽插入事务,2号事槽的提交标记又变成快速提交,同时oracle会把原来1号事务槽的提交标记由U(快速提交)变成C(正常提交),并且同时还清除锁标记Lck=0andlb: 0x00,最后就是我们要说的数据块延迟清洗推进,即在csc: 0x00.4bb8d1改修最后的SCN,实际上csc是本块的最小的commit SCN.
那下面我按上面所说再来做个操作,即插入一下数据,提交,dump,再观察 块头的flg,事务槽,数据,及csc。
gyj@OCM> update t1 set name='CCCCC' where id=1;
2 rows updated.
gyj@OCM> commit;
Commit complete.
gyj@OCM> alter system flush buffer_cache;
System altered.
sys@OCM> alter system dump datafile 3 block 132;
System altered.
dump 的内容如下:注意看下面的红色字体部分
数据块头
buffer tsn: 7 rdba: 0x00c00084 (3/132)
scn: 0x0000.004bbba3 seq: 0x03flg: 0x06tail:0xbba30603
frmt: 0x02 chkval: 0x3d04 type:0x06=trans data
事务ITL
Block header dump:0x00c00084
Object id on Block? Y
seg/obj: 0x12723csc:0x00.4bb8d1itc: 2flg: Etyp: 1 - DATA
brn: 0bdba:0xc00080 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba FlagLck Scn/Fsc
0x01 0x0008.016.00001131 0x018019a3.0160.16--U- 1fsc 0x0000.004bb8d3
0x02 0x0004.003.00000c54 0x01801a36.00d1.03--U- 2fsc 0x0000.004bbba3
数据部分
bdba: 0x00c00084
data_block_dump,data header at0xc03664
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x00c03664
76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f69
avsp=0x1f5c
tosp=0x1f5c
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f8c
0x14:pri[1] offs=0x1f69
0x16:pri[2] offs=0x1f75
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x2cc:2
col0: [ 2]c1 02
col1: [ 5]43 43 43 43 43
tab 0, row 1, @0x1f69
tl: 12 fb: --H-FL-- lb: 0x2cc:2
col0: [ 2]c1 02
col1: [ 5]43 43 43 43 43
tab 0, row 2, @0x1f75
tl: 12 fb: --H-FL-- lb: 0x1cc:2
col0: [ 2]c1 03
col1: [ 5]42 42 42 42 42
end_of_block_dump
dump出来发现不是我上面所说的,呵呵。。。,现在两个事务槽的提交标记都是U,U就是代表快速提交,即不清楚行锁。看下面两个dump的csc: 0x00.4bb8d1即数据块延迟清洗没有推进,不要急,我们再做一个操作,再操作一下事务,这次肯定会清楚行锁 ,并且csc: 0x00.4bb8d1即数据块延迟清洗肯定会推进。
gyj@OCM> insert into t1 values(3,'DDDDDD') ;
1 row created.
gyj@OCM> commit;
Commit complete.
gyj@OCM> alter system flush buffer_cache;
System altered.
sys@OCM> alter system dump datafile 3 block 132;
System altered.
dump 的内容如下:注意看下面的红色字体部分
数据块头
buffer tsn: 7 rdba: 0x00c00084 (3/132)
scn: 0x0000.004bbd8b seq: 0x01flg: 0x06tail: 0xbd8b0601
frmt: 0x02 chkval: 0xc1f4 type: 0x06=trans data
事务ITL
Object id on Block? Y
seg/obj: 0x12723csc: 0x00.4bbd8aitc: 2flg:Etyp: 1 - DATA
brn: 0bdba: 0xc00080 ver: 0x01 opc: 0
inc: 0exflg: 0
Itl Xid Uba FlagLck Scn/Fsc
0x010x0002.014.0000105d0x01801aa2.0130.17--U- 1fsc 0x0000.004bbd8b
0x020x0004.003.00000c540x01801a36.00d1.03C--- 0scn 0x0000.004bbba3
数据部分
bdba: 0x00c00084
data_block_dump,data header at 0xd85664
===============
tsiz: 0x1f98
hsiz: 0x1a
pbl: 0x00d85664
76543210
flag=--------
ntab=1
nrow=4
frre=-1
fsbo=0x1a
fseo=0x1f5c
avsp=0x1f4d
tosp=0x1f4d
0xe:pti[0] nrow=4offs=0
0x12:pri[0] offs=0x1f8c
0x14:pri[1] offs=0x1f69
0x16:pri[2] offs=0x1f75
0x18:pri[3] offs=0x1f5c
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x0cc: 2
col0: [ 2]c1 02
col1: [ 5]43 43 43 43 43
tab 0, row 1, @0x1f69
tl: 12 fb: --H-FL-- lb: 0x0cc: 2
col0: [ 2]c1 02
col1: [ 5]43 43 43 43 43
tab 0, row 2, @0x1f75
tl: 12 fb: --H-FL-- lb: 0x0cc: 2
col0: [ 2]c1 03
col1: [ 5]42 42 42 42 42
tab 0, row 3, @0x1f5c
tl: 13 fb: --H-FL-- lb: 0x1cc: 2
col0: [ 2]c1 04
col1: [ 6]44 44 44 44 44 44
end_of_block_dump
flg: 0x06=0x02+0x04
果然是这样,当事务槽上的提交标志都是快速提交(U),那再有事务进来,Oracle先找个ITL SLOT插入事务,顺便把其它ITL slot上的快速提交U 变成正常提交C,并且清除行锁,最最最得要我想说的就是csc: 0x00.4bbd8a数据块延迟清洗真的推进了(原来是csc: 0x00.4bb8d1)。。。一定记住csc: 0x00.4bbd8a是数据本块中最小的COMMIT SCN,实际上它表示上次事务槽上没清除的锁现在清除一下,然后就做了一个延迟清洗推进.
那什么是事务?事务的定义是一个独立的逻辑工作单元:它由特定的一系列必须作为一个整体一起成功或失败的SQL语句组成。事务可以由多个数据操作语言(data manipulation language,DML)语句组成,但只能含有一个数据定义语言(data definition language,DDL)语句。
事务的ACID特征
A)、原子性(Atomicity)
事务中的所有动作要么都发生,要么都不发生
B)、一致性(Consistency)
事务将数据库从一种状态转变为下一种一致状态
C)、隔离性(Isolation)
一个事务的影响在该事务提交前对其他事务都不可见
D)、持久性(Durability)
事务一旦提交,其结果就是永久性的
事务的定义和特性就说到这里,我继续dump,分本一下数据块中的ITL槽,OK,我现在马上开始一个事务:
我现在把T1表中的id=3的这行的name=DDDDDD 改成EEEEEE,做UPDATE操作,不提交,让事务一直活动着。
gyj@OCM> select id,name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#
from t1 where id=3;
ID NAME FILE# BLOCK#
---------- ---------- ---------- ----------
3 DDDDDD 3 132
gyj@OCM> update t1 set name ='EEEEEE' where id=3;
1 row updated.
这时先不要提交,让事务活动着,一会去观察块中的ITL槽,为了能让上面修改的数据马上写到数据文件,执行缓存刷新操作,
如下:
gyj@OCM> alter system flush buffer_cache;
System altered.
好,这时,我马上开一个新窗口做dump操作:
sys@OCM> alter system dump datafile 3 block 132;
System altered.
贴出DUMP的主要内容ITL部分:
Object id on Block? Y
seg/obj: 0x12723csc: 0x00.4c5fd3itc: 2flg: Etyp: 1 - DATA
brn: 0bdba: 0xc00080 ver: 0x01 opc: 0
inc: 0exflg: 0
Itl Xid Uba FlagLck Scn/Fsc
0x01 0x0002.014.0000105d0x01801aa2.0130.17C--- 0scn 0x0000.004bbd8b
0x02 0x0008.00b.000011440x01801e95.0161.1b---- 1fsc 0x0000.00000000
这里 seg/obj: 0x12723就是对象号,我们用计算器把0x12723(16进制转化成10进制)得到75555,就是说对角号是75555.
sys@OCM> select OBJECT_ID,DATA_OBJECT_ID from dba_objects where object_NAME='T1' and owner='GYJ';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
75350 75555
各位兄弟注意了,这里的对象号是指段的号即DATA_OBJECT_ID( OBJECT_ID与DATA_OBJECT_ID,什么时候不一样呢,一般做truncate操作,DATA_OBJECT_ID就会发生变化,这里就不细说了)
好,我们的重点就是看ITL槽,从上面的ITL看出,我们刚刚操作的update正在活动的事务就是在第二个事务槽上即:
Itl Xid Uba FlagLck Scn/Fsc
0x02 0x0008.00b.000011440x01801e95.0161.1b---- 1fsc 0x0000.00000000
我主要来分析一下Xid和Uba
首先Xid是由XIDUSN(Undo segment number)、XIDSLOT(Slot number)+XIDSQN(Sequence number)三部分组成的。
OK,即然说到事务,我们不得不看视图:v$transaction:
sys@OCM> select xid,xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec,status from v$transaction;
XID XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------------
08000B0044110000 8 11 4420 6 7829 353 27 ACTIVE
从上面的视图v$transaction得到:
XIDUSN=8 (8号回滚段)
XIDSLOT=11(在8号回滚段的事务表的第11行),哥哥这里不要晕哦,这里的事务表是指8号回滚段的段头块。
XIDSQN=4420 (事务表第11行被覆盖了4420次)
把上面数据块中ITL事务槽中的Xid=0x0008.00b.00001144进行分解,你们看:
0x0008 (16进制)--> (10进制)8
00b(16进制)-->(10进制) 11
00001144(16进制)-->(10进制)4420
分解出来完本与我们在transaction中看到的 XIDUSN XIDSLOT XIDSQN完成一样!
好,我们再来看ILT中的Uba=0x01801e95.0161.1b进行分析:
Uba由文件号、块号、序列号及记录号四部分组成的:
0x01801e95(16进制)--> (10进制)由四个字节组成把它转成32位的二进制,取前面10位二进制得到0000000110=6,剩下的
22位=7829(其实就是0x1e95用计算器转得到7829)
0161 (16进制)--> (10进制) 353
1b (16进制)--> (10进制) 27
我靠,分解出来与我们在transaction中看到的UBAFIL UBABLK UBASQN UBAREC完成一致!
兄弟们,你们觉得知道这些有什么用吗,其实很有用啊,这些就是UNDO啊,呵呵Oracle之前就靠UNDO打下半壁江山,对于UNDO,我
会在下后面的帖中做详细介绍让彻底解读UNDO让一致性读不再是秘密!(这里留个位置放undo的超链接)
讲到这里,其实还有个跟事务分不开的东东,那就是锁,一个很重要的视图:v$lock;
sys@OCM> select * from v$lock where sid=183;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
50C84DA4 50C84DD0 183 AE 100 0 4 0 22492 0
02066600 02066630 183 TM 75350 0 3 0 2893 0
4FA268F4 4FA26934 183 TX 524299 4420 6 0 2893 0
这信息很有用:
TM锁:TM-75350-0
TX锁:TX-524299-4420
对于锁制机会在后面的帖中分享一下移动级的:锁等待分析处理、DX锁等待处理(这里留个位置放超链接)
最后总结:数据块的组成部分,包括以下四部分:
2、事务槽ITL
3、数据
4、数据块尾
数据块格式就先说到这里了,有问题的兄弟可以一起讨论学习!不断更新中。。。
补充:NUMBER类型的转储
col0: [ 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 转存后是
col0: [ 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
2values(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: 0x1cc: 1
col0: [ 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
2values(-123.333);
1 row inserted
SQL> commit;
Commit complete
进行DUMP如上
tab 0, row 1, @0x1f90
tl: 10 fb: --H-FL-- lb: 0x2cc: 1
col0: [ 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;
这样数字就完成了转换。
**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name: guoyJoe
QQ: 252803295
Email: oracledba_cn@hotmail.com
Blog: http://blog.csdn.net/guoyJoe
ITPUB: http://www.itpub.net/space-uid-28460966.html
OCM: http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!
答案在:http://blog.csdn.net/guoyjoe/article/details/8624392
Oracle@Paradise 总群:127149411
Oracle@Paradise No.1群:177089463(已满)
Oracle@Paradise No.2群:121341761
Oracle@Paradise No.3群:140856036
相关推荐
标题"bufr-高空数据解析-气象数据"表明我们将探讨如何解析BUFR格式的高空气象数据。描述中的“适合气象行业数据解析”进一步强调了这一主题的实用性,尤其是对于需要处理此类数据的专业人士。 首先,我们需要了解...
本主题将深入探讨如何使用Python进行BUFR地面数据的解析。 首先,Python是数据科学领域广泛使用的编程语言,拥有丰富的库和工具,可以方便地处理和分析各种数据,包括气象BUFR数据。对于BUFR数据的解析,Python中有...
《S7-1200 PLC使用数据块的深度解析》 在自动化控制领域,西门子S7-1200系列PLC是广泛应用的一种小型控制器,它以其灵活、高效的特点深受工程师们的喜爱。本教程以“S7-1200 使用数据块示例-跟我学”为主题,通过...
总的来说,这个项目展示了如何在Linux环境下利用Radarcape和开源工具进行ADS-B数据的捕获和解析,结合`adsb-decode-guide.pdf`的指导,可以深入理解ADS-B系统的工作原理,并开发出定制化的飞行数据监控应用程序。...
NCEPLIBS-bufr-develop 是一个专为气象数据解析设计的工具,它主要针对BUFR(Binary Universal Form for the Representation of Meteorological Data)格式的文件。BUFR是一种国际标准化的数据格式,由世界气象组织...
对于使用Python处理天气雷达数据的程序员来说,了解这个标准格式可以帮助他们正确解析和使用数据,创建能够准确反映天气情况的应用程序。 上述标准格式的详细内容对气象科研人员、工程师以及任何涉及到气象数据处理...
总结而言,本文深入探讨了Asterix Category 021协议的数据项构成和编码方法,并提供了一种使用Python语言对ADS-B数据进行解析和应用的实现方法。这种方法不仅为ADS-B数据处理提供了参考,也为开发人员在航空通信监视...
ComTrade格式数据文件解析、显示及分析的知识点介绍: ***Trade格式定义 ComTrade格式是一种标准电力系统暂态数据交换通用格式,它主要记录电力系统或电力系统模型采集到的暂态波形和事故数据。ComTrade格式的优势...
本文将深入探讨segY数据格式的细节,包括其卷头部分的组成以及道记录块的具体信息,帮助读者更好地理解和应用这一重要格式。 #### 二、segY记录格式详解 ##### 2.1 卷头 卷头部分位于segY文件的最前端,占据3600...
Java开发案例-springboot-17-整合WebMagic实现爬取和解析CSDN文章数据-源代码+文档.rar Java开发案例-springboot-17-整合WebMagic实现爬取和解析CSDN文章数据-源代码+文档.rar Java开发案例-springboot-17-整合...
- **关键数据块(Critical Chunks)**:这些数据块是必须存在的,包括文件头数据块(IHDR)、调色板数据块(PLTE,可选)、图像数据块(IDAT)和图像结束数据块(IEND)。 - **辅助数据块(Ancillary Chunks)**:...
**Forward数据结构WIS格式详解** 在测井领域,数据的准确分析与处理至关重要,而Forward软件正是这样一个专业工具,它能对地下岩石...通过深入学习和实践,我们可以更好地利用WIS格式提升测井数据的处理效率和精度。
“VOC数据集2400张”则说明了数据集的大小和结构遵循了PASCAL VOC数据集的标准,这是一个广泛使用的物体检测和分割的数据集格式。 在“压缩包子文件的文件名称列表”中看到的“VOCdevkit”,这是PASCAL VOC数据集的...
- **解析数据格式**:根据前面提到的数据格式解析每一帧的信息。 - **可视化处理结果**:使用MATLAB内置函数绘制处理后的数据,如距离图、速度图等。 通过这些代码示例,工程师可以快速搭建起自己的数据分析框架,...
【SEG-D数据格式解析】 SEG-D格式是一种广泛应用于地震数据记录的标准格式,尤其在陆上三维地震勘探领域中。此格式由国际地球物理学家学会(SEG)制定,并随着时间的推移,经历了多次版本更新,以适应不断变化的技术...
- FLV文件格式:FLV是一种用于存储音频、视频和同步元数据的容器格式,常见于Adobe Flash Player的多媒体内容中。 - 分块传输:HTTP-FLV通过将FLV文件切分成多个数据块(Tag)进行传输,每个数据块包含音视频帧...
S-57格式海图测试数据,航海保证部IHO生产,内容包括C1100103.000、C1313100.000、C1513179.000、C1515591.000、C1613182.000,地图为渤海、黄海、东海、长江口,用于格式分析学习、软件解析测试,请勿用于商业用途...
通过对STM32的GPS数据解析过程的深入分析,我们可以看到,实现这一功能的关键在于正确配置USART接口以接收串行数据,并通过有效的状态机机制来解析不同的NMEA数据句。在实际应用中,还需要根据具体的需求进一步优化...
在这个“Nodejs自定义解析表单数据的中间件案例”中,我们将深入探讨如何使用JavaScript编写自定义的中间件来解析HTTP请求中的表单数据。 ### 1. 中间件概念 中间件在Node.js中是通过Express框架(基于Connect库)...