`

oracle16进制转10进制,双字节算法实现,优化后

阅读更多
CREATE OR REPLACE PROCEDURE CONVERT_16_10
/*16进制转10进制,双字节算法实现*/
(
  I_DATA          VARCHAR2, 
  O_DATA      OUT VARCHAR2
) 
AS
  V_TMP_BEGIN     INT;
  V_TMP_LEN       INT;
  V_TMP_VAL       INT := 0;
  V_TMP_TEXT      VARCHAR2(1);
  V_TMP_DATA      VARCHAR2(100);
BEGIN

  IF I_DATA IS NULL THEN
    RETURN;
  ELSE
    V_TMP_BEGIN := 1;
    V_TMP_LEN   := LENGTH(I_DATA);
  
    IF V_TMP_LEN > 8 THEN
      RETURN;
    END IF;
  
    IF V_TMP_LEN = 1 AND I_DATA = '0' THEN
      O_DATA := '0';
      RETURN;
    END IF;
  
  END IF;

  WHILE V_TMP_BEGIN <= V_TMP_LEN LOOP
  
    V_TMP_TEXT := SUBSTR(I_DATA, V_TMP_BEGIN, 1);
  
    IF V_TMP_TEXT NOT IN
       ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F') THEN
      RETURN;
    END IF;
  
    IF V_TMP_TEXT = '1' THEN
      V_TMP_DATA := V_TMP_DATA || '0001 ';
    
    ELSIF V_TMP_TEXT = '2' THEN
      V_TMP_DATA := V_TMP_DATA || '0010 ';
    
    ELSIF V_TMP_TEXT = '3' THEN
      V_TMP_DATA := V_TMP_DATA || '0011 ';
    
    ELSIF V_TMP_TEXT = '4' THEN
      V_TMP_DATA := V_TMP_DATA || '0100 ';
    
    ELSIF V_TMP_TEXT = '5' THEN
      V_TMP_DATA := V_TMP_DATA || '0101 ';
    
    ELSIF V_TMP_TEXT = '6' THEN
      V_TMP_DATA := V_TMP_DATA || '0110 ';
    
    ELSIF V_TMP_TEXT = '7' THEN
      V_TMP_DATA := V_TMP_DATA || '0111 ';
    
    ELSIF V_TMP_TEXT = '8' THEN
      V_TMP_DATA := V_TMP_DATA || '1000 ';
    
    ELSIF V_TMP_TEXT = '9' THEN
      V_TMP_DATA := V_TMP_DATA || '1001 ';
    
    ELSIF V_TMP_TEXT = 'A' THEN
      V_TMP_DATA := V_TMP_DATA || '1010 ';
    
    ELSIF V_TMP_TEXT = 'B' THEN
      V_TMP_DATA := V_TMP_DATA || '1011 ';
    
    ELSIF V_TMP_TEXT = 'C' THEN
      V_TMP_DATA := V_TMP_DATA || '1100 ';
    
    ELSIF V_TMP_TEXT = 'D' THEN
      V_TMP_DATA := V_TMP_DATA || '1101 ';
    
    ELSIF V_TMP_TEXT = 'E' THEN
      V_TMP_DATA := V_TMP_DATA || '1110 ';
    
    ELSIF V_TMP_TEXT = 'F' THEN
      V_TMP_DATA := V_TMP_DATA || '1111 ';
    
    ELSE
      V_TMP_DATA := V_TMP_DATA || '0000 ';
    
    END IF;
  
    V_TMP_BEGIN := V_TMP_BEGIN + 1;
  
  END LOOP;

  O_DATA := REPLACE(V_TMP_DATA, ' ', '');

  IF LENGTH(O_DATA) = 32 THEN
    -- 初始值要么为0,要么为最小值
    V_TMP_VAL := TO_NUMBER(SUBSTR(O_DATA, 1, 1)) * POWER(2, 31) * -1;
    -- 重新初始化字符串对象
    O_DATA := SUBSTR(O_DATA, 2);
  
  END IF;

  V_TMP_BEGIN := 1;
  V_TMP_LEN   := LENGTH(O_DATA);

  WHILE V_TMP_BEGIN <= V_TMP_LEN LOOP

    IF SUBSTR(O_DATA, V_TMP_BEGIN, 1) = '1' THEN
    
      V_TMP_VAL := V_TMP_VAL + POWER(2, V_TMP_LEN - V_TMP_BEGIN);
    
    END IF;
  
    V_TMP_BEGIN := V_TMP_BEGIN + 1;
  
  END LOOP;

  O_DATA := TO_CHAR(V_TMP_VAL);

END;

0
4
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    MD5算法源码_JS_Java_Oracle_MySQL

    返回的结果是二进制的,可以进一步转换为16进制字符串。 MySQL也有内置的`MD5()`函数,用于计算字符串的MD5值: ```sql SELECT MD5('Hello, World!'); ``` 这将直接返回一个32位的十六进制MD5摘要。 在处理MD5时...

    Java写的简易计算器(绝对原创,能实现基本功能,待优化)

    - **十六进制 (hex)**:十六进制是基于16的计数系统,使用0到9和A到F这16个符号。Java的Integer.toHexString()方法可以将十进制数转换为十六进制字符串。 6. **用户界面**:虽然描述没有提及,但通常一个计算器会...

    Oracle定义DES加密解密及MD5加密函数示例

    MD5是一种广泛使用的哈希函数,它将任意长度的输入转化为固定长度的128位(16字节)摘要。在Oracle中,可以使用`DBMS_OBFUSCATION_TOOLKIT`包的`MD5`函数来计算MD5哈希值。`MD5`函数接收一个VARCHAR2类型的输入(`...

    2014山东专升本计算机复习资料.pdf

    数制转换通常采用位权展开法,将一个数制转换为10进制,再从10进制转换为其他数制。 数据单位在计算机中扮演着重要角色。最基本的单位是位(bit),它代表1个二进制数,即0或1。8个位组成1个字节(Byte),是存储...

    计算机基础习题.pdf

    8. **数的比较**:不同进制数中,(2E)16(A)最大,因为转换为十进制后为46,其余数均小于46。 9. **二进制转八进制**:二进制数101101101101.11转换成八进制数是5555.6(B)。 10. **逻辑运算**:执行逻辑或运算...

    Oracle9i的init.ora参数中文说明

    值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: 从 NLS_TERRITORY 中获得 nls_date_language: 说明: 指定拼写日期名, 月名和日期缩写词 (AM, PM, AD, BC) 的语言。...

    AES256加密工具类,及其所必须的jar包

    在AES256Util中,这个库可能会被用于将加密后的字节数组转换为可读的Base64字符串,以及将接收到的Base64字符串解码回字节数组进行解密。 在实际应用中,AES256加密工具类可以用于保护敏感信息,例如用户密码、...

    江苏省计算机二级2009年(春)笔试试卷及答案.pdf

    2. 最大的10位无符号二进制整数转换成八进制数,转换规则为每3位二进制对应1位八进制,所以最大值是1111111111,转换为八进制为1777。 3. 关于PC机CPU的描述,错误的是B,双核CPU并不是指主板上有两个独立的芯片,...

    C#编程经验技巧宝典

    58 &lt;br&gt;0081 文本中首字母改为大写 59 &lt;br&gt;0082 C#随机数的产生 59 &lt;br&gt;0083 身份证从15位升至18位算法 60 &lt;br&gt;0084 十进制数转二进制数的算法 60 &lt;br&gt;0085 十进制数转八进制数的算法 61...

    2021-2022计算机二级等级考试试题及答案No.5375.docx

    3. **存储容量单位**:计算机中的存储容量通常以二进制位(bit)为最小单位,常见的还有字节(byte)、千字节(KB)、兆字节(MB)、吉字节(GB)等。 4. **C语言数组定义**:在C语言中,一维数组的定义方式是`类型...

    南开20春学期《大学计算机基础》在线作业解答全貌.docx

    10. **计算思维**:计算思维涉及抽象、算法设计、问题转化等,不直接依赖数学公式和定理(D)。 11. **Excel分类汇总**:在进行分类汇总前,需先对数据进行排序(B)。 12. **网络安全**:网络钓鱼攻击(C)不等同...

    java开源包10

    这是一个实现了 Yen 的排名算法的无环路径的项目 Java日历空间 JCalendarButton JCalendarButton是一个简单的java swing日历选择控件。它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是...

    计算机基础模拟测试二.pdf

    10. 关系型数据库:目前大多数数据库管理系统支持关系型数据模型,如SQL Server、Oracle、MySQL等。 11. 控制结构:程序设计中的基本控制结构包括顺序、分支和循环。 12. 图灵机与冯·诺依曼模型:存储程序和程序...

    java开源包3

    这是一个实现了 Yen 的排名算法的无环路径的项目 Java日历空间 JCalendarButton JCalendarButton是一个简单的java swing日历选择控件。它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是...

    java开源包4

    这是一个实现了 Yen 的排名算法的无环路径的项目 Java日历空间 JCalendarButton JCalendarButton是一个简单的java swing日历选择控件。它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是...

    4-计算机基础计算机软件练习题(参考答案)(20211105210807).pdf

    24. **页面调度算法**:虚拟存储器通常使用优化的调度算法,如最近最少使用(LRU),而不是FIFO。 选择题部分涉及了操作系统、软件类型、计算机层次、编程语言、硬件性能等多个知识点,如: 1. **D. Oracle** 不是...

    成人计算机统考试题九.pdf

    成人计算机统考试题九涉及到多个IT领域的基础知识,涵盖了计算机存储、网络、操作系统、数据库、编程、计算机硬件、软件开发流程、编码标准、网络协议等多个方面。...30. 十进制114转二进制是1110010。答案是B。

    2021-2022计算机二级等级考试试题及答案No.13195.docx

    Java 程序编译成字节码后,可以在任何支持 JVM 的平台上运行,无需重新编译。 ### Map 集合特点 8. **Map 集合的键值对概念**。 - **解释**:Map 集合中的元素都是以键值对的形式存在的,其中键是唯一的,而值可以...

    hibernate 主键生成策略

    - **描述**:与 UUID.Hex 类似,但生成的是一个 16 字节的字符串。 - **应用场景**:适用于需要较短字符串形式的 GUID 的场景。 #### 10. Foreign - **描述**:使用外部表的一个字段作为主键。 - **应用场景**:当...

Global site tag (gtag.js) - Google Analytics