oracle 二进制与运算,ORACLE使用函数对二进制、十进制、十六进制数互相转换
文中涉及:
十进制与十六进制的互相转换
二进制与十进制的互相转换
二进制与十六进制的互相转换
1.将十进制的数转换为十六进制的数请使用to_char函数。 数据库中16进制的表达是按照字符串来描述的,所以将十进制的数转换为十六进制的数使用to_char函数
BYS@bys1>select to_char(10,'xxx'), to_char(42,'xxx') from dual;
TO_C TO_C
---- ----
a 2a
2.将十六进制的数转换为十进制的数请使用to_number函数。 如下,16进制A是10.2A是2*16+A=42.注意xxx,如果转换的数比较大,要多写几个,避免位数不足而报错。
BYS@bys1>select to_number('a','xxx'), to_number('2a','xxx') from dual;
TO_NUMBER('A','XXX') TO_NUMBER('2A','XXX')
-------------------- ---------------------
10 42
####################################################
ORACLE未提供二进制与十进制互转的函数,可以自己创建。以下十进制与二进制转换脚本引自惜纷飞博客,感谢!
3.十进制转换二进制--使用自定义函数 CREATE OR REPLACE FUNCTION NUMBER_TO_BIT(V_NUM NUMBER)
RETURN VARCHAR IS V_RTN VARCHAR(8);--注意返回列长度
V_N1 NUMBER;
V_N2 NUMBER;
BEGIN
V_N1 := V_NUM;
LOOP
V_N2 := MOD(V_N1, 2);
V_N1 := ABS(TRUNC(V_N1 / 2));
V_RTN := TO_CHAR(V_N2) || V_RTN;
EXIT WHEN V_N1 = 0;
END LOOP;
--返回二进制长度
SELECT lpad(V_RTN,8,0)
INTO V_RTN
FROM dual;
return V_RTN;
end;
BYS@bys1>col a255 for a20
BYS@bys1>col a1 for a20
BYS@bys1>select number_to_bit(255) as a255,number_to_bit(1) as a1 from dual;
A255 A1
-------------------- --------------------
11111111 00000001
4.二进制转换十进制--使用自定义函数 CREATE OR REPLACE FUNCTION BIT_TO_NUMBER(P_BIN IN VARCHAR2) RETURN NUMBER AS
V_SQL VARCHAR2(30000) := 'SELECT BIN_TO_NUM(';
V_RETURN NUMBER;
BEGIN
IF LENGTH(P_BIN) >= 256 THEN
RAISE_APPLICATION_ERROR(-20001, 'INPUT BIN TOO LONG!');
END IF;
IF LTRIM(P_BIN, '01') IS NOT NULL THEN
RAISE_APPLICATION_ERROR(-20002, 'INPUT STR IS NOT VALID BIN VALUE!');
END IF;
FOR I IN 1 .. LENGTH(P_BIN) LOOP
V_SQL := V_SQL || SUBSTR(P_BIN, I, 1) || ',';
END LOOP;
V_SQL := RTRIM(V_SQL, ',') || ') FROM DUAL';
EXECUTE IMMEDIATE V_SQL
INTO V_RETURN;
RETURN V_RETURN;
END;
BYS@bys1>select bit_to_number('11111111') from dual;
BIT_TO_NUMBER('11111111')
-------------------------
255
5.关于创建公有同义词解决其它用户引用当前用户的定义函数的问题:
当前BYS用户为DBA用户,其它用户默认无法使用当前用户的自定义函数。关于同义词,更详细:http://blog.csdn.net/q947817003/article/details/14104519
可以将自定义函数的执行权限授予PUBLIC用户,并创建公有同义词。这样其它用户就可以通过引用公有同义词来使用新建的自定义函数了。
BYS@bys1>select * from user_objects where object_type='FUNCTION';
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
-------------------- ------------------------------ ---------- -------------- -------------------
CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE
------------------- ------------------- ------------------- ------- - - - ----------
EDITION_NAME
------------------------------
NUMBER_TO_BIT 76930 FUNCTION
2013/11/03 11:57:30 2013/11/03 11:57:30 2013-11-03:11:57:30 VALID N N N 1
BIT_TO_NUMBER 76931 FUNCTION
2013/11/03 12:00:16 2013/11/03 12:00:16 2013-11-03:12:00:16 VALID N N N 1
创建公有同义词--先不将函数执行权限授予PUBLIC,此时从其它用户使用函数报错。
BYS@bys1>create public synonym number_to_bit for number_to_bit;
Synonym created.
BYS@bys1>conn test/test
Connected.
TEST@bys1>select number_to_bit(255) from dual;
select number_to_bit(255) from dual
*
ERROR at line 1:
ORA-00904: : invalid identifier
将函数执行权限授予PUBLIC,此时从其它用户可以正常使用函数。
TEST@bys1>conn bys/bys
Connected.
BYS@bys1>grant execute on number_to_bit to public;
Grant succeeded.
BYS@bys1>conn test/test
Connected.
TEST@bys1>select number_to_bit(255) from dual;
NUMBER_TO_BIT(255)
----------------------------------------------------------------------------------------------------
11111111
#########################
对于bit_to_number函数,先将函数执行权限授予PUBLIC,但是并未创建同义词。此时使用其它用户执行函数报错
BYS@bys1>grant execute on bit_to_number to public;
Grant succeeded.
TEST1@bys1>select bit_to_number(11111111) from dual;
select bit_to_number(11111111) from dual
*
ERROR at line 1:
ORA-00904: "BIT_TO_NUMBER": invalid identifier
TEST1@bys1>conn bys/bys
Connected.
此时对函数创建公有同义词,使用其它用户可以正常执行函数。
BYS@bys1>create public synonym bit_to_number for bit_to_number;
Synonym created.
BYS@bys1>conn test1/test1
Connected.
TEST1@bys1>select bit_to_number(11111111) from dual;
BIT_TO_NUMBER(11111111)
-----------------------
255 ###################################################################
6.二进制与十六进制的转换
因为没有直接的函数,但是结合以上的十进制转二进制与十进制转十六进制函数,可以通过函数嵌套来实现二进制与十六进制的转换。
即先使用二进制与十进制的转换,再将转换成的十进制做为参数转换为十六进制。 BYS@bys1>select number_to_bit(17) as a255 from dual;
A255
--------------------
00010001
下面语句得出16进制数11,换算成十进制是17,转换正确完成。
BYS@bys1>select to_char(
bit_to_number('00010001'),'xxx') from dual;
TO_C
----
11
7.十六进制与二进制的转换 BYS@bys1> select to_number('11','xxx') from dual;
TO_NUMBER('11','XXX')
---------------------
17
下面语句可以将16进制转成二进制,与上面语句对比,转换结果正确。
BYS@bys1> select number_to_bit(to_number('11','xxx')) from dual;
NUMBER_TO_BIT(TO_NUMBER('11','XXX'))
----------------------------------------------------------------------------------------------------
00010001
##############################################################################
8.其它转换函数:
HEXTORAW 语法: HEXTORAW(string)
功能: 将由string表示的二进制数值转换为一个RAW数值. String应该包含一个十六进制的数值. String中的每两个字符表示了结果RAW中的一个字节..HEXTORAW和RAWTOHEX为相反的两个函数.
使用位置: 过程性语言和SQL语句。
BYS@bys1>select hextoraw('abcdef') from dual;
HEXTOR
------
ABCDEF
RAWTOHEX
语法: RAWTOHEX(rawvalue)
功能: 将RAW类数值rawvalue转换为一个相应的十六进制表示的字符串. rawvalue中的每个字节都被转换为一个双字节的字符串. RAWTOHEX和HEXTORAW是两个相反的函数.
使用位置: 过程性语言和SQL语句。
BYS@bys1>SELECT RAWTOHEX('11') FROM DUAL;
RAWT
----
3131
BYS@bys1>SELECT RAWTOHEX('1') FROM DUAL;
RA
--
31
BYS@bys1>SELECT RAWTOHEX('2') FROM DUAL;
RA
--
32
RAWTONHEX
语法: RAWTONHEX(rawvalue)
功能: 将RAW类型值rawvalue转换为一个十六进制表示的字符串。rawvalue中的每个字节转换为一个双字符的字符串。RAWTONHEX返回值是NVARCHAR2类型而不是VARCHAR2类型。
使用位置: 过程性语言和SQL语句。
oracle 二进制与运算,ORACLE使用函数对二进制、十进制、十六进制数互相转换相关推荐
- 编写一个C程序,实现以下功能:编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101。在main函数中输入整数n,调用函数,输出它的二进制
题目要求: 编写一个C程序,实现以下功能: //编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101. //在main函数中输入整数n,调用函数 ...
- oracle 二进制与运算,Oracle怎么操作进行二进制的比对
Oracle如何&操作进行二进制的比对 oracle 中 bitand( ) 函数 返回两个数值型数值在按位进行 AND 运算后的结果. 语法 BITAND(nE ...
- oracle学习笔记(二)------函数
函数:单行函数,多行函数 单行函数:字符函数,Number函数,日期函数,转换函数,系统函数 (oracle中所有字母都是以大写字母存储的) 字符函数:转换函数,字符操纵函数 转换函数:low ...
- 【ORACLE】详解oracle数据库UTL_RAW包各个函数的模拟算法
前言 这篇文章可能是你至今(2022-02-11)能在互联网看到的,关于utl_raw包的逻辑说得最深入的一篇文章了. 由于最近在复刻oracle中自带的包到其他数据库,因此需要对oracle中的包的 ...
- Oracle列合并成行之wm_concat函数浅析
文章目录 1.LOB类型 2. wm_concat()函数的使用 在工作中提取数据报表时碰到了很多只有一个字段不同,其他N个字段都相同的数据,用行来显示不免觉得太过冗余,于是搜寻网络发现Oracle有 ...
- oracle中常用关键字,oracle常用函数及关键字笔记
--函数及关键字-- 1.trim,ltrim,rtrim 去除字符,无指定默认去除空格 SELECT TRIM('a' FROM 'aafhfhaaaaaaaa'), LTRIM('aafhfhaa ...
- oracle向前推一个小时,oracle SQL里常用的时间函数,经典推荐
oracle SQL里常用的时间函数,经典推荐 (2009-03-11 23:16:54) 标签: 杂谈 常用日期型函数 1.Sysdate 当前日期和时间 SQL> Select sysdat ...
- oracle union all写法,【oracle】-集合运算:UNION,UNION ALL...
在Oracle中提供了三种类型的集合操作: 并(UNION).交(INTERSECT).差(MINUS) UNION:求并,重复记录只显示一次. UNION ALL:求并集,显示所有记录信息. INT ...
- oracle中类似indexof用法_instr函数
oracle中类似indexof用法_instr函数 [sql] 在oracle中没有indexof()函数 但是提供了一个 instr() 方法 具体用法: select instr('保定市南市区 ...
最新文章
- linux测试网页装载时间,如何用Flood测试Web服务器响应时间
- 温度单闭环实验计算机控制,过程控制系统实践指导简介,目录书摘
- 计算机里硬盘图标,计算机中在硬盘图标下面有个其他里PPS图标肿么删?
- vim global命令
- STM32U5来了,100份好礼免费送!
- java 7.0下载_Java jre 7.0
- 动态规划之图像压缩问题
- 关于JS中使用JSON.parse长整型数丢失精度的问题解决
- linux私有ftp搭建与创建新用户
- SSD固态硬盘4K对齐一键分区
- linux运行natapp,Centos使用natapp教程
- 深入探讨apply()方法的作用
- 第三方APP实现QQ登陆
- 概率论复习用 更新中
- 为什么不能睁一只眼闭一只眼_“睁一只眼,闭一只眼”才是人生的最高境界
- 如何缓解焦虑?做好这5件事,让你不再焦虑
- android studio导入arr文件
- ASP.NET/C# 控制器Controller的深入理解
- win10账号被锁定如何解决
- SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)