`

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
分享到:
评论
发表评论

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

相关推荐

    Oracle9i的init.ora参数中文说明

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

    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...

    java开源包10

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

    java开源包3

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

    java开源包4

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

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java开源包1

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

    java开源包11

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

    java开源包2

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

    java开源包6

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

    java开源包5

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

    java开源包8

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

    java开源包7

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

    java开源包9

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

    java开源包101

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

    Java资源包01

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

    20春学期《大学计算机基础》在线作业.23266101.docx

    A:8 B:16 C:32 D:128 答案:C Access的数据表中删除一条记录,被删除的记录( )。 A:不能恢复 B:可恢复为第一条记录 20春学期《大学计算机基础》在线作业全文共12页,当前为第1页。C:可恢复为最后一条记录 20春...

    网管教程 从入门到精通软件篇.txt

    INT:中间代码,当一个源程序经过语法检查后编译产生一个可执行代码 IOF:Findit文档 IQY:Microsoft Internet查询文件 ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP:X-Internet签字文件 ...

Global site tag (gtag.js) - Google Analytics