`

oracle 进制之间转换

阅读更多
CREATE OR REPLACE TYPE type_str_agg AS OBJECT
(
  total VARCHAR2(4000),

  STATIC FUNCTION odciaggregateinitialize(sctx IN OUT type_str_agg)
    RETURN NUMBER,

  MEMBER FUNCTION odciaggregateiterate
  (
    SELF  IN OUT type_str_agg,
    VALUE IN VARCHAR2
  ) RETURN NUMBER,

  MEMBER FUNCTION odciaggregateterminate
  (
    SELF        IN type_str_agg,
    returnvalue OUT VARCHAR2,
    flags       IN NUMBER
  ) RETURN NUMBER,

  MEMBER FUNCTION odciaggregatemerge
  (
    SELF IN OUT type_str_agg,
    ctx2 IN type_str_agg
  ) RETURN NUMBER
)
/
CREATE OR REPLACE TYPE BODY type_str_agg IS

  STATIC FUNCTION odciaggregateinitialize(sctx IN OUT type_str_agg)
    RETURN NUMBER IS
  BEGIN
    sctx := type_str_agg(NULL);
    RETURN odciconst.success;
  END;

  MEMBER FUNCTION odciaggregateiterate
  (
    SELF  IN OUT type_str_agg,
    VALUE IN VARCHAR2
  ) RETURN NUMBER IS
  BEGIN
    SELF.total := SELF.total || VALUE;
    RETURN odciconst.success;
  END;

  MEMBER FUNCTION odciaggregateterminate
  (
    SELF        IN type_str_agg,
    returnvalue OUT VARCHAR2,
    flags       IN NUMBER
  ) RETURN NUMBER IS
  BEGIN
    returnvalue := SELF.total;
    RETURN odciconst.success;
  END;

  MEMBER FUNCTION odciaggregatemerge
  (
    SELF IN OUT type_str_agg,
    ctx2 IN type_str_agg
  ) RETURN NUMBER IS
  BEGIN
    SELF.total := SELF.total || ctx2.total;
    RETURN odciconst.success;
  END;

END;
/




CREATE OR REPLACE FUNCTION f_stragg(p_input VARCHAR2) RETURN VARCHAR2
  PARALLEL_ENABLE
  AGGREGATE USING type_str_agg;
/


CREATE OR REPLACE PACKAGE pkg_number_trans IS

  FUNCTION f_bin_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2;
 
  FUNCTION f_bin_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2;
 
  FUNCTION f_bin_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION f_oct_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2;
 
  FUNCTION f_oct_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION f_oct_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2;
 
  FUNCTION f_hex_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION f_hex_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION f_hex_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2;
 
  FUNCTION f_dec_to_bin(p_int IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION f_dec_to_oct(p_int IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION f_dec_to_hex(p_int IN VARCHAR2) RETURN VARCHAR2;
 
END pkg_number_trans;
/
CREATE OR REPLACE PACKAGE BODY pkg_number_trans IS


  FUNCTION f_bin_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_bin_to_oct
    -- 对象描述: 二进制转换八进制
    -- 输入参数: p_str 二进制字符串
    -- 返回结果: 八进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_bin_to_oct('11110001010') FROM dual;
    -- 备    注: 需要定义f_stragg函数和type_str_agg类型
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
    v_bin    VARCHAR2(4000);
  BEGIN
    v_bin := substr('00' || p_str, -3 * ceil(length(p_str) / 3));
    SELECT f_stragg(data1) INTO v_return
      FROM (SELECT (CASE upper(substr(v_bin, (rownum - 1) * 3 + 1, 3))
                     WHEN '000' THEN '0'
                     WHEN '001' THEN '1'
                     WHEN '010' THEN '2'
                     WHEN '011' THEN '3'
                     WHEN '100' THEN '4'
                     WHEN '101' THEN '5'
                     WHEN '110' THEN '6'
                     WHEN '111' THEN '7'
                   END) data1
              FROM dual
            CONNECT BY rownum <= length(v_bin) / 3);
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_bin_to_oct;

  FUNCTION f_bin_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_bin_to_dec
    -- 对象描述: 二进制转换十进制
    -- 输入参数: p_str 二进制字符串
    -- 返回结果: 十进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_bin_to_dec('11110001010') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return  VARCHAR2(4000);
  BEGIN
    SELECT SUM(data1) INTO v_return
      FROM (SELECT substr(p_str, rownum, 1) * power(2, length(p_str) - rownum) data1
              FROM dual
            CONNECT BY rownum <= length(p_str));
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_bin_to_dec;

  FUNCTION f_bin_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_bin_to_hex
    -- 对象描述: 二进制转换十六进制
    -- 输入参数: p_str 二进制字符串
    -- 返回结果: 十六进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_bin_to_oct('11110001010') FROM dual;
    -- 备    注: 需要定义f_stragg函数和type_str_agg类型
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
    v_bin    VARCHAR2(4000);
  BEGIN
    v_bin := substr('000' || p_str, -4 * ceil(length(p_str) / 4));
    SELECT f_stragg(data1) INTO v_return
      FROM (SELECT (CASE upper(substr(v_bin, (rownum - 1) * 4 + 1, 4))
                     WHEN '0000' THEN '0'
                     WHEN '0001' THEN '1'
                     WHEN '0010' THEN '2'
                     WHEN '0011' THEN '3'
                     WHEN '0100' THEN '4'
                     WHEN '0101' THEN '5'
                     WHEN '0110' THEN '6'
                     WHEN '0111' THEN '7'
                     WHEN '1000' THEN '8'
                     WHEN '1001' THEN '9'
                     WHEN '1010' THEN 'A'
                     WHEN '1011' THEN 'B'
                     WHEN '1100' THEN 'C'
                     WHEN '1101' THEN 'D'
                     WHEN '1110' THEN 'E'
                     WHEN '1111' THEN 'F'
                   END) data1
              FROM dual
            CONNECT BY rownum <= length(v_bin) / 4);
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_bin_to_hex;

  FUNCTION f_oct_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_oct_to_bin
    -- 对象描述: 八进制转换二进制
    -- 输入参数: p_str 八进制字符串
    -- 返回结果: 二进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_oct_to_bin('3612') FROM dual;
    -- 备    注: 需要定义f_stragg函数和type_str_agg类型
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
  BEGIN
    SELECT to_char(to_number(f_stragg(data1))) INTO v_return
      FROM (SELECT (CASE upper(substr(p_str, rownum, 1))
                     WHEN '0' THEN '000'
                     WHEN '1' THEN '001'
                     WHEN '2' THEN '010'
                     WHEN '3' THEN '011'
                     WHEN '4' THEN '100'
                     WHEN '5' THEN '101'
                     WHEN '6' THEN '110'
                     WHEN '7' THEN '111'
                   END) data1
              FROM dual
            CONNECT BY rownum <= length(p_str));
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_oct_to_bin;

  FUNCTION f_oct_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_oct_to_dec
    -- 对象描述: 八进制转换十进制
    -- 输入参数: p_str 八进制字符串
    -- 返回结果: 十进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_oct_to_dec('3612') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return  VARCHAR2(4000);
  BEGIN
    SELECT SUM(data1) INTO v_return
      FROM (SELECT substr(p_str, rownum, 1) * power(8, length(p_str) - rownum) data1
              FROM dual
            CONNECT BY rownum <= length(p_str));
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_oct_to_dec;
 
  FUNCTION f_oct_to_hex(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_oct_to_bin
    -- 对象描述: 八进制转换十六进制
    -- 输入参数: p_str 八进制字符串
    -- 返回结果: 十六进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_oct_to_hex('3612') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
    v_bin    VARCHAR2(4000);
  BEGIN
    SELECT pkg_number_trans.f_oct_to_bin(p_str) INTO v_bin FROM dual;
    SELECT pkg_number_trans.f_bin_to_hex(v_bin) INTO v_return FROM dual;
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_oct_to_hex;

  FUNCTION f_dec_to_bin(p_int IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_dec_to_bin
    -- 对象描述: 十进制转换二进制
    -- 输入参数: p_str 十进制字符串
    -- 返回结果: 二进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_dec_to_bin('1930') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
    v_hex    VARCHAR2(4000);
  BEGIN
    SELECT pkg_number_trans.f_dec_to_hex(p_int) INTO v_hex FROM dual;
    SELECT pkg_number_trans.f_hex_to_bin(v_hex) INTO v_return FROM dual;
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_dec_to_bin;
 
  FUNCTION f_dec_to_oct(p_int IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_dec_to_oct
    -- 对象描述: 十进制转换八进制
    -- 输入参数: p_str 十进制字符串
    -- 返回结果: 八进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_dec_to_oct('1930') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
    v_bin    VARCHAR2(4000);
  BEGIN
    SELECT pkg_number_trans.f_dec_to_bin(p_int) INTO v_bin FROM dual;
    v_bin := substr('00' || v_bin, -3 * ceil(length(v_bin) / 3));
    SELECT f_stragg(data1) INTO v_return
      FROM (SELECT (CASE upper(substr(v_bin, (rownum - 1) * 3 + 1, 3))
                     WHEN '000' THEN '0'
                     WHEN '001' THEN '1'
                     WHEN '010' THEN '2'
                     WHEN '011' THEN '3'
                     WHEN '100' THEN '4'
                     WHEN '101' THEN '5'
                     WHEN '110' THEN '6'
                     WHEN '111' THEN '7'
                   END) data1
              FROM dual
            CONNECT BY rownum <= length(v_bin) / 3);
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_dec_to_oct;
 
  FUNCTION f_dec_to_hex(p_int IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_dec_to_oct
    -- 对象描述: 十进制转换十六进制
    -- 输入参数: p_str 十进制字符串
    -- 返回结果: 十六进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_dec_to_hex('1930') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
  BEGIN
    SELECT upper(TRIM(to_char(p_int, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'))) INTO v_return FROM dual;
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_dec_to_hex;
 
  FUNCTION f_hex_to_bin(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_dec_to_oct
    -- 对象描述: 十六进制转换二进制
    -- 输入参数: p_str 十六进制字符串
    -- 返回结果: 二进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_hex_to_oct('78A') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
  BEGIN
    SELECT to_char(to_number(f_stragg(data1))) INTO v_return
      FROM (SELECT (CASE upper(substr(p_str, rownum, 1))
                     WHEN '0' THEN '0000'
                     WHEN '1' THEN '0001'
                     WHEN '2' THEN '0010'
                     WHEN '3' THEN '0011'
                     WHEN '4' THEN '0100'
                     WHEN '5' THEN '0101'
                     WHEN '6' THEN '0110'
                     WHEN '7' THEN '0111'
                     WHEN '8' THEN '1000'
                     WHEN '9' THEN '1001'
                     WHEN 'A' THEN '1010'
                     WHEN 'B' THEN '1011'
                     WHEN 'C' THEN '1100'
                     WHEN 'D' THEN '1101'
                     WHEN 'E' THEN '1110'
                     WHEN 'F' THEN '1111'
                   END) data1
              FROM dual
            CONNECT BY rownum <= length(p_str));
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_hex_to_bin;
 
  FUNCTION f_hex_to_oct(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_dec_to_oct
    -- 对象描述: 十六进制转换八进制
    -- 输入参数: p_str 十六进制字符串
    -- 返回结果: 八进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_hex_to_oct('78A') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return VARCHAR2(4000);
    v_bin    VARCHAR2(4000);
  BEGIN
    SELECT pkg_number_trans.f_hex_to_bin(p_str) INTO v_bin FROM dual;
    SELECT pkg_number_trans.f_bin_to_oct(v_bin) INTO v_return FROM dual;
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_hex_to_oct;
 
  FUNCTION f_hex_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS
    ----------------------------------------------------------------------------------------------------------------------
    -- 对象名称: f_hex_to_dec
    -- 对象描述: 十六进制转换十进制
    -- 输入参数: p_str 十六进制字符串
    -- 返回结果: 十进制字符串
    -- 测试用例: SELECT pkg_number_trans.f_hex_to_dec('78A') FROM dual;
    ----------------------------------------------------------------------------------------------------------------------
    v_return  VARCHAR2(4000);
  BEGIN
    SELECT SUM(data1) INTO v_return
      FROM (SELECT (CASE upper(substr(p_str, rownum, 1))
                     WHEN 'A' THEN '10'
                     WHEN 'B' THEN '11'
                     WHEN 'C' THEN '12'
                     WHEN 'D' THEN '13'
                     WHEN 'E' THEN '14'
                     WHEN 'F' THEN '15'
                     ELSE substr(p_str, rownum, 1)
                   END) * power(16, length(p_str) - rownum) data1
              FROM dual
            CONNECT BY rownum <= length(p_str));
    RETURN v_return;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
  END f_hex_to_dec;
 
END pkg_number_trans;
/

分享到:
评论

相关推荐

    oracle_34进制转10进制_10进制转34进制_生成34进制最大编码

    实现10进制和34进制之间的转换,资源包含三个Oracle自定义函数,分别为: 34进制转换为10进制; 10进制转换为34进制; 生成34进制的最大编码; 欢迎提宝贵意见! 799192594@qq.com

    oracle 10进制转34进制 sql

    一个SQL脚本函数,10进制转换为34进制。34进制指以0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、J、K、L、M、N、P、Q、R、S、T、U、V、W、X、Y、Z为基数做累加。

    Oracle中用SQL语句实现进制间互相转换

    在Oracle数据库中,有时我们需要对数字进行不同进制之间的转换,比如从二进制、八进制或十六进制转换为十进制。这在处理二进制数据、存储编码或者解析特定格式的数据时非常有用。Oracle提供了一种利用SQL语句实现...

    SQL脚本函数 34进制转换为10进制

    ### SQL脚本函数:34进制转换为10进制 #### 背景介绍 在计算机科学领域,不同的进制系统被广泛应用于数据表示和处理中。常见的进制有二进制(2进制)、八进制(8进制)、十进制(10进制)和十六进制(16进制)。而...

    用一条SQL 实现其它进制到十进制的转换

    本文将详细解释如何使用一条SQL语句在Oracle中实现二进制、八进制和十六进制到十进制的转换,并探讨这些转换背后的逻辑。 首先,我们来看二进制到十进制的转换。二进制系统只有两个数字,0和1,其基数是2。在提供的...

    二进制、八进制、十进制、十六进制-相互转换.jar

    二进制 八进制 十进制 十六进制 相互转换 jar 含源代码 运行前安装JRE先,下载地址: http://download.oracle.com/otn-pub/java/jdk/6u29-b11/jre-6u29-windows-i586.exe 本程序用Java编写,适合java爱好者使用

    ORACLE 自动类型转换

    在Oracle数据库中,数据类型的自动转换是一个非常重要的概念,它涉及到数据存储、查询以及不同数据类型之间的交互。本文将深入探讨“ORACLE 自动类型转换”这一主题,以帮助理解Oracle如何处理不同类型的数据以及...

    oracle(blob转换为clob)

    `UTL_RAW.CAST_TO_VARCHAR2`是Oracle提供的一个包中的函数,用于将RAW或BLOB类型的二进制数据转换为VARCHAR2字符串类型。这一步骤对于将BLOB转换为CLOB至关重要,因为CLOB本质上是一种字符数据类型,而不能直接与二...

    oracle字段类型转换的处理

    Oracle数据库支持多种数据类型,包括数值类型(如NUMBER、INTEGER、BINARY_FLOAT等)、字符类型(如VARCHAR2、CHAR、CLOB等)、日期时间类型(如DATE、TIMESTAMP等)以及二进制类型(如RAW、BLOB等)。在实际应用中...

    SqlServer与Oracle保存与读取图片二进制流

    4. **跨数据库操作**:在SQL Server和Oracle之间迁移或共享图片数据时,可能需要使用数据迁移工具或编程接口,如ODBC或JDBC,将二进制流从一个数据库复制到另一个。 5. **性能考虑**: - **存储效率**:存储二进制...

    springMvc+Oracle的图片转二进制流

    当涉及到图片处理时,有时需要将图片转换为二进制流,以便于在数据库中存储和检索。以下将详细讲解如何在Spring MVC和Oracle环境中实现这一过程。 首先,我们需要理解图片转二进制流的概念。在计算机系统中,图片...

    Guid转换为oracle存储格式

    理解这个转换过程对于在C#和Oracle之间进行数据交换至关重要,特别是在处理包含Guid的业务对象时。同时,这也涉及到数据序列化和反序列化,以及不同数据类型的兼容性问题。在实际开发中,确保正确处理这些转换可以...

    3 进制转换.docx

    - **源码、反码、补码**:十进制数转换为二进制时,正数的三种表示方式相同;负数则有所不同。 - **源码**:直接转换得到的二进制数。 - **反码**:源码取反。 - **补码**:反码加一。 - **8/16/32位二进制数**:...

    图片以二进制保存到Oracle,取出并显示到页面示例

    本示例将探讨如何在Oracle数据库中以二进制格式存储图片,并随后从数据库中取出显示在网页上。Oracle数据库提供了BLOB(Binary Large Object)数据类型,专门用于存储大对象,如图像、音频文件或任何其他二进制数据...

    oracle财务数字转换中文

    从给定的文件信息来看,主要讨论的是在Oracle数据库中将数字转换为中文大写金额的函数实现。这个过程在财务系统中非常常见,尤其是在中国等使用汉字的国家和地区,因为正式的财务文档通常需要将数值金额转换为中文...

    Oracle SQL 内置函数大全(3)

    2. **HEXTORAW(str)**:这个函数将由十六进制数字组成的字符串转换成二进制数据。它常用于处理二进制数据,例如在存储图像或文件时。 3. **RAWTOHEXT(raw)**:与`HEXTORAW`相反,`RAWTOHEXT`将二进制数据转换为十六...

    转换oracle数据库dmp文件版本号工具

    在Oracle数据库管理中,经常需要处理不同版本之间的数据迁移问题。其中,`.dmp`文件是Oracle用于导出数据库的一种常见格式,它包含了数据库的元数据和实际数据。然而,在将`.dmp`文件从一个环境迁移到另一个环境时,...

    oracle Blob转换Clob

    ### Oracle Blob转换Clob #### 知识点一:Oracle Blob与Clob的基本概念 - **Blob (Binary Large Object)**:在Oracle数据库中,Blob类型用于存储大量的二进制数据,如图像、视频或文档等非结构化数据。 - **Clob ...

    oracle中的BLOB(照片)转换到mysql中

    本篇将详细讲解如何在Oracle与MySQL之间进行BLOB类型的转换,特别是针对照片的处理。 首先,让我们了解BLOB类型。BLOB是一种可以存储大量二进制数据的对象,分为四种子类型:BLOB、CLOB、NCLOB和BFILE。在Oracle中...

Global site tag (gtag.js) - Google Analytics