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

  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;

猜你喜欢

转载自anole1982.iteye.com/blog/1883327