在写block dump里解释一个rdba的概念,需要换算二进制和10进制,对于二进制和十进制的换算,Oracle没有提供
自己写了 一个简单的处理,原理很简单,
十进制到二进制
不停的除以2,然后用余数留下,取整的接着循环。
功能很简单,不支持负数和小数,有没有考虑递归算法呀。
代码如下
create or replace function number_2_bit(v_num number) return varchar is
v_rtn varchar(2000);
v_n1 number;
v_n2 number;
begin
v_n1:=v_num;
loop
v_n2 := mod(v_n1, 2);
v_n1 := trunc(v_n1/2);
--dbms_output.put_line(v_n2 || ' ' || v_n1);
v_rtn := to_char(v_n2) || v_rtn ;
exit when v_n1 = 0;
end loop;
return v_rtn;
end;
二进制到十进制
上面的逆反过程
对字符串遍历,然后用power对每个位上的进行计算乘以位上的数,然后结果相加
代码如下
create or replace function bit_2_number(v_bitstr varchar) return number is
v_rtn number;
v_nstr varchar(1000);
begin
v_rtn:=0;
for i in 1..length(v_bitstr) loop
v_rtn:= v_rtn+power(2, i-1)*substr(v_bitstr, -i, 1);
end loop;
return v_rtn;
end;
下面是我写的rdba_info的方法来调用他们
create or replace function rdba_info(v_rdba varchar) return varchar is
v_rtn varchar(2000);
v_filestr varchar(2000);
v_blockstr varchar(2000);
v_n1 number;
begin
select to_number(v_rdba,'xxxxxxxxxx') into v_n1 from dual;
v_rtn := number_2_bit(v_n1);
select substr(v_rtn, -22, 22), substr(v_rtn, 1, length(v_rtn)-22) into v_blockstr, v_filestr from dual;
dbms_output.put_line(v_filestr || ' ' || v_blockstr);
return v_rtn;
end;
测试
十进制到二进制
SQL> select number_2_bit(10) from dual;
NUMBER_2_BIT(10)
--------------------------------------------------------------------------------
1010
二进制到十进制
SQL> select bit_2_number('1010') from dual;
BIT_2_NUMBER('1010')
--------------------
10
RDBA测试
SQL> select rdba_info('0381a5b1') from dual;
RDBA_INFO('0381A5B1')
--------------------------------------------------------------------------------
14========107953.
测试全部通过,以后算RDBA就不要计算器来算了。
附件是完整的代码,包括源码和建同义词的sql
附件
-
2009-11-11 21:39,下载次数: 0

-
2009-11-11 21:39,下载次数: 0

-
2009-11-11 21:39,下载次数: 0
