当前位置:首页 > 开发 > 数据库 > 正文

oracle 进制转换 rowid 转 36进制字符串

发表于: 2013-06-06   作者:anole1982   来源:转载   浏览次数:
摘要:   FUNCTION FUN_ROWID_TO_36HEX(p_ID in VARCHAR2) return varchar2 is    V_OBJECT_ID INTEGER;    V_O_S       VARCHAR2(7);   

  FUNCTION FUN_ROWID_TO_36HEX(p_ID in VARCHAR2) return varchar2 is
    V_OBJECT_ID INTEGER;
    V_O_S       VARCHAR2(7);
    V_FILE_ID   INTEGER;
    V_F_S       VARCHAR2(4);
    V_BLOCK_ID  INTEGER;
    V_B_S       VARCHAR2(6);
    V_ROW_NO    INTEGER;
    V_R_S       VARCHAR(4);
    V_TIME      INTEGER;
    V_T_S       VARCHAR(9);
    v_r         varchar(32);
  BEGIN
    select dbms_rowid.rowid_object(p_ID) object_id,
           dbms_rowid.rowid_relative_fno(p_ID) file_id,
           dbms_rowid.rowid_block_number(p_ID) block_id,
           dbms_rowid.rowid_row_number(p_ID) num
      INTO V_OBJECT_ID, V_FILE_ID, V_BLOCK_ID, V_ROW_NO
      from DUAL;
    select (sysdate - to_date('1970-01-01', 'yyyy-mm-dd')) * 86400000
      into V_TIME
      from dual;
    V_O_S := FUN_INT_TO_36HEX(V_OBJECT_ID);
    V_F_S := FUN_INT_TO_36HEX(V_FILE_ID);
    V_B_S := FUN_INT_TO_36HEX(V_BLOCK_ID);
    V_R_S := FUN_INT_TO_36HEX(V_ROW_NO);
    V_T_S := FUN_INT_TO_36HEX(V_TIME);
    V_O_S := lpad(V_O_S, 7, '0');
    V_F_S := lpad(V_F_S, 4, '0');
    V_B_S := lpad(V_B_S, 6, '0');
    V_R_S := lpad(V_R_S, 4, '0');
    V_T_S := lpad(V_T_S, 9, '0');
    v_r   := V_T_S || V_O_S || V_F_S || V_B_S || V_R_S;
    v_r   := lpad(v_r, 32, '0');
    return v_r;
  END;

  FUNCTION FUN_INT_TO_36HEX(NUM IN INTEGER) RETURN VARCHAR2 IS
  BEGIN
    RETURN to_base(NUM, 36);
  END;
  function to_base(p_dec in number, p_base in number) return varchar2 is
    l_str varchar2(255) default NULL;
    l_num number default p_dec;
    l_hex varchar2(36) default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  begin
    if (trunc(p_dec) <> p_dec OR p_dec < 0) then
      raise PROGRAM_ERROR;
    end if;
    loop
      l_str := substr(l_hex, mod(l_num, p_base) + 1, 1) || l_str;
      l_num := trunc(l_num / p_base);
      exit when(l_num = 0);
    end loop;
    return l_str;
  end to_base;

  function to_dec(p_str in varchar2, p_from_base in number default 16)
    return number is
    l_num number default 0;
    l_hex varchar2(16) default '0123456789ABCDEF';
  begin
    for i in 1 .. length(p_str) loop
      l_num := l_num * p_from_base +
               instr(l_hex, upper(substr(p_str, i, 1))) - 1;
    end loop;
    return l_num;
  end to_dec;

  function to_hex(p_dec in number) return varchar2 is
  begin
    return to_base(p_dec, 16);
  end to_hex;
  function to_bin(p_dec in number) return varchar2 is
  begin
    return to_base(p_dec, 2);
  end to_bin;

  function to_oct(p_dec in number) return varchar2 is
  begin
    return to_base(p_dec, 8);
  end to_oct;

oracle 进制转换 rowid 转 36进制字符串

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
, 进制的转换, 二进制,十进制,八进制,十六进制。 一、二进制转换十进制, 举例,把二进制 110
进制转换 目录[隐藏] 一、正数 一、正数 1. 十 -----> 二 2. 二 ----> 十 3. 十 ----> 八
十进制-->二进制 原理:1、将被除数除以2,得到商与余数,并记录下余数 2、如果所得商为0,则运
1. 十进制到二进制   口诀:除2取余倒排 2. 二进制到10进制   口诀:按位乘权相加 3. 二进制到8
十进制转二进制: //十进制转二进制 #include<iostream> using namespace std; void printbin
十进制转二进制: //十进制转二进制 #include<iostream> using namespace std; void printbin
八进制:0,1,2,3,4,5,6,7 十六进制:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 其中F
Java 字符串 进制转换 工具 源码 刚写了小工具,丢到blog来充数,很小的jar,加上源码才12KB…… 没
Java 字符串 进制转换 工具 源码 刚写了小工具,丢到blog来充数,很小的jar,加上源码才12KB…… 没
Java 字符串 进制转换 工具 源码 刚写了小工具,丢到blog来充数,很小的jar,加上源码才12KB…… 没
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号