文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle中通过函数实现二、八、十、十六进制任意转换

2024-04-02 19:55

关注

说明:本文主要参考于: http://www.eygle.com/archives/2004/06/oracle_howto_convert.html

一、先创建两个基本的进制转换函数:

    1.其他进制(2,8,16)转换为十进制


    Create Or Replace Function To_Dec(p_Str       In Varchar2,    --要转换的数字(2,8,16进制)
                                      p_From_Base In Number Default 16)    --转换前的进制
      Return Number Is
      i_Num Number Default 0;
      i_Hex Varchar2(16) Default '0123456789ABCDEF';
    Begin
      For i In 1 .. Length(p_Str) Loop
        i_Num := i_Num * p_From_Base + Instr(i_Hex, Upper(Substr(p_Str, i, 1))) - 1;
      End Loop;
      Return i_Num;
    End To_Dec;

    2.十进制转换为其它进制(2,8,16)


    Create Or Replace Function To_Base(p_Dec In Number,    --要转换的数字(10进制)
                                       p_Base In Number)   --转换后的进制
      Return Varchar2 Is
      i_Str Varchar2(255) Default Null;
      i_Num Number Default p_Dec;
      i_Hex Varchar2(16) Default '0123456789ABCDEF';
    Begin
      If Trunc(p_Dec) <> p_Dec Or p_Dec < 0 Then
        Raise Program_Error;
      End If;
      Loop
        i_Str := Substr(i_Hex, Mod(i_Num, p_Base) + 1, 1) || i_Str;
        i_Num := Trunc(i_Num / p_Base);
        Exit When i_Num = 0;
      End Loop;
      Return i_Str;
    End To_Base;

二、通过上面两个函数,可以将10进制作为转换的中间桥梁。在进行任意进制转换时,都可以先将要转换的进制转为10进         制,然后再通过10进制转换为别的进制。 通过下面函数来实现:


    Create Or Replace Function Bodh_Convert(p_Str  In Varchar2, --要转换的数字(2,8,10,16进制)
                                            p_From Number,      --转换前的进制
                                            p_To   Number)      --转换后的进制
      Return Varchar2 Is
      v_Temp Number Default 0;
      v_Num  Varchar2(128) Default Null;
    Begin
      If p_From = 2 Then
        If p_To = 8 Then
          v_Temp := To_Dec(p_Str, p_From);
          v_Num  := To_Base(v_Temp, p_To);
        Elsif p_To = 10 Then
          v_Num := To_Dec(p_Str, p_From);
        Elsif p_To = 16 Then
          v_Temp := To_Dec(p_Str, p_From);
          v_Num  := To_Base(v_Temp, p_To);
        End If;
      Elsif p_From = 8 Then
        If p_To = 2 Then
          v_Temp := To_Dec(p_Str, p_From);
          v_Num  := To_Base(v_Temp, p_To);
        Elsif p_To = 10 Then
          v_Num := To_Dec(p_Str, p_From);
        Elsif p_To = 16 Then
          v_Temp := To_Dec(p_Str, p_From);
          v_Num  := To_Base(v_Temp, p_To);
        End If;
      Elsif p_From = 10 Then
        If p_To = 2 Then
          v_Num := To_Base(To_Number(p_Str), p_To);
        Elsif p_To = 8 Then
          v_Num := To_Base(To_Number(p_Str), p_To);
        Elsif p_To = 16 Then
          v_Num := To_Base(To_Number(p_Str), p_To);
        End If;
      Elsif p_From = 16 Then
        If p_To = 2 Then
          v_Temp := To_Dec(p_Str, p_From);
          v_Num  := To_Base(v_Temp, p_To);
        Elsif p_To = 8 Then
          v_Temp := To_Dec(p_Str, p_From);
          v_Num  := To_Base(v_Temp, p_To);
        Elsif p_To = 10 Then
          v_Num := To_Dec(p_Str, p_From);
        End If;
      End If;
      Return v_Num;
    Exception
      When Others Then
        Dbms_Output.Put_Line('请输入正确的参数');
    End Bodh_Convert;

三、示例:


    SQL> select bodh_convert('1111',2,8) from dual;    --2进制转8进制
     
    BODH_CONVERT('1111',2,8)
    --------------------------------------------------------------------------------
    17
     
    SQL> select bodh_convert('1111',2,10) from dual;    --2进制转10进制
     
    BODH_CONVERT('1111',2,10)
    --------------------------------------------------------------------------------
    15
     
    SQL> select bodh_convert('1111',2,16) from dual;    --2进制转16进制
     
    BODH_CONVERT('1111',2,16)
    --------------------------------------------------------------------------------
    F

   



阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯