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

本文介绍了一种使用双字节算法将16进制数转换为10进制数的方法。该算法首先将输入的16进制字符串逐字符转换成对应的二进制表示,然后计算出其十进制数值。适用于数据库存储过程等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值