UTL_RAW 包

为了在 DM 上兼容 oracle 的 utl_raw 包,提供功能上与 oracle 基本一致的 utl_raw 包。利用这个包提供将十六进制类型转化为其它数据类型的函数和一系列十六进制类型相关函数。

30.1 相关方法

utl_raw 包所支持的 20 个函数,分别实现十六进制的相关转化函数。这些函数通过调用相应系统内部函数来实现存取数据的过程。如下详细介绍各函数:

  1. XRANGE

输出包含 start~end 在内的,十六进制单字节区间内的全部字节。

语法如下:

FUNCTION XRANGE(
	START_BYTE	IN	VARBINARY	DEFAULT NULL,
	END_BYTE	IN	VARBINARY	DEFAULT NULL
) RETURN VARBINARY;

参数详解

  • start 输入参数,单字节 varbinary 数据。
  • end 输入参数,单字节 varbinary 数据。

注意:1)要求 start 和 end 都是单字节。若超过了一个字节,则只从左取第一个高位字节;2)如果 start 值>end 值,则返回以 start 十六进制字节开始的,通过 FF 至 00,再到 end 的全部十六进制字节;3)如果 start 为 null 默认为 00,end 为 null 默认为 FF,二者均为 null 则 start 默认为 00,end 默认为 FF。

注意

1)要求start和end都是单字节。若超过了一个字节,则只从左取第一个高位字节;
2)如果start值>end值,则返回以start十六进制字节开始的,通过FF至00,再到end的全部十六进制字节;
3)如果start为null默认为00,end为null默认为FF,二者均为null则start默认为00,end默认为FF。

  1. BIT_AND

输出 r1 与 r2 的按位运算的逻辑与。

语法如下:

FUNCTION BIT_AND(
	R1 	IN 	VARBINARY,
	R2 	IN 	VARBINARY
) RETURN VARBINARY;

参数详解

  • r1 输入参数,varbinary 数据。
  • r2 输入参数,varbinary 数据。

注意:如果 r1、r2 长度不等,则对长度较小的参数低位补 0XFF 字节至与另一个参数对齐后再做按位运算。

3 BIT_COMPLEMENT

输出 r 的按位运算的反码。

语法如下:

FUNCTION BIT_COMPLEMENT(
	R 	IN 	VARBINARY
) RETURN VARBINARY;

参数详解

  • R 输入参数,varbinary 数据。
  1. BIT_OR

输出 r1 与 r2 的按位运算的逻辑或。

语法如下:

FUNCTION BIT_OR(
	R1 	IN 	VARBINARY,
	R2 	IN 	VARBINARY
) RETURN VARBINARY;

参数详解

  • r1 输入参数,varbinary 数据。
  • r2 输入参数,varbinary 数据。

注意:如果 r1、r2 长度不等,则对长度较小的参数低位补 0X00 字节至与另一个参数对齐后再做按位运算。

  1. BIT_XOR

输出 r1 与 r2 的按位运算的逻辑异或。

语法如下:

FUNCTION BIT_XOR(
	R1 	IN 	VARBINARY,
	R2 	IN 	VARBINARY
) RETURN VARBINARY;

参数详解

  • r1 输入参数,varbinary 数据。
  • r2 输入参数,varbinary 数据。
注意

如果r1、r2长度不等,则对长度较小的参数低位补0X00字节至与另一个参数对齐后再做按位运算。

  1. COMPARE

比较十六进制串数据 r1 和 r2。如果 r1 串长度<r2 串长度,r1 串用 pad 填充至二者长度相等后再作比较。返回结果:数字,表示从几个数字开始不相等。0 表示相等。

语法如下:

FUNCTION COMPARE(
	R1  				IN 		VARBINARY,
	R2  				IN 		VARBINARY,
	PAD  				IN 		VARBINARY,
	LSCHEMA_NAME 				VARCHAR,
	LTABLE_NAME  				VARCHAR,
	LCOL_NAME    				VARCHAR,
	RSCHEMA_NAME 				VARCHAR,
	RTABLE_NAME  				VARCHAR,
	RCOL_NAME    				VARCHAR
) RETURN NUMBER;

参数详解

  • r1 输入参数,varbinary 数据。
  • r2 输入参数,varbinary 数据。
  • PAD 输入参数,varbinary 数据。
  • lschema_name 左数据源串所在模式名。
  • ltable_name 左数据源串所在表名。
  • lcol_name 左数据源串所在列名。
  • rschema_name 右数据源串所在模式名。
  • rtable_name 右数据源串所在表名。
  • rcol_name 右数据源串所在列名。
  1. CONCAT

按参数顺序分别连接各个十六进制串数。最多可连接 12 个。返回连接后的十六进制串数值。

语法如下:

FUNCTION CONCAT(
	R1  		IN 		VARBINARY 	DEFAULT NULL,
	R2  		IN 		VARBINARY 	DEFAULT NULL,
	R3  		IN 		VARBINARY 	DEFAULT NULL,
	R4  		IN 		VARBINARY 	DEFAULT NULL,
	R5  		IN 		VARBINARY 	DEFAULT NULL,
	R6  		IN 		VARBINARY 	DEFAULT NULL,
	R7  		IN 		VARBINARY 	DEFAULT NULL,
	R8  		IN 		VARBINARY 	DEFAULT NULL,
	R9  		IN 		VARBINARY 	DEFAULT NULL,
	R10  		IN 		VARBINARY 	DEFAULT NULL,
	R11  		IN 		VARBINARY 	DEFAULT NULL,
	R12  		IN 		VARBINARY 	DEFAULT NULL
) RETURN VARBINARY;
  1. CONVERT_RAW

将十六进制串数值从后指定的字符集到前指定的字符集转换。

语法如下:

FUNCTION CONVERT_RAW (
	R        			IN 		VARBINARY,
	TO_CHARSET			IN 		VARCHAR2,
	FROM_CHARSET 		IN 		VARCHAR2
) RETURN VARBINARY;

参数详解

支持 utf8 与其它字符集(GBK、BIG5、ISO_8859_9、EUC_JP、EUC_KR、KOI8R、GB18030、SQL_ASCII、ISO_8859_1)的相互转换。

  1. COPIES

将十六进制串数值拷贝 n 次,依次排在前一个数的后面。返回新的十六进制数值。

语法如下:

FUNCTION COPIES(
	R 	IN 	VARBINARY,
	N 	IN 	NUMBER
) RETURN VARBINARY;
  1. LENGTH

返回十六进制串的字节长度。

语法如下:

FUNCTION LENGTH(
	R 	IN 	VARBINARY
) RETURN NUMBER;
  1. overlay_raw

用十六进制串 overlay_str 覆盖源十六进制串 target 中指定的十六进制子串。

语法如下:

FUNCTION OVERLAY_RAW(
	OVERLAY_STR 	IN 		VARBINARY,
	TARGET  		IN 		VARBINARY,
	POS   			IN 		INTEGER 		DEFAULT 1,
	LEN   			IN 		INTEGER 		DEFAULT NULL,
	PAD   			IN 		VARBINARY  		DEFAULT NULL
) RETURN VARBINARY;

参数详解

  • overlay_str 十六进制串。
  • target 源十六进制串。
  • pos 子串在源串 target 中的起始位置。
  • len 子串的长度。
  • pad overlay_str 串长度若小于 len 或 pos 超过了 target 的长度,用 pad 值代替。
  1. REVERSE_RAW

将输入十六进制串的字符顺序反转后返回。

语法如下:

FUNCTION REVERSE_RAW (
	R 	IN 	VARBINARY
) RETURN VARBINARY;
  1. SUBSTR

返回十六进制串中从字节位置 POS 开始的 LEN 个字节。

语法如下:

FUNCTION SUBSTR(
	R   		IN 		VARBINARY,
	POS 		IN 		INTEGER,
	LEN 		IN 		INTEGER 		DEFAULT NULL
) RETURN VARBINARY;
  1. TRANSLATE

十六进制替换函数。将 R 字符串中的 from_set 串,全部替换成 to_set 串。

语法如下:

FUNCTION TRANSLATE(
	R        	IN 		VARBINARY,
	FROM_SET  	IN 		VARBINARY,
	TO_SET   	IN 		VARBINARY
) RETURN VARBINARY;

参数详解

  • r 源字符串。
  • from_set 被替换的字符串。
  • to_set 替换后的字符串。
  1. TRANSLITERATE

功能和 TRANSLATE 一样。

语法如下:

FUNCTION TRANSLITERATE(
	R        		IN 		VARBINARY,
	TO_SET   		IN 		VARBINARY  	DEFAULT NULL,
	FROM_SET 		IN 		VARBINARY  	DEFAULT NULL,
	PAD     		IN 		VARBINARY  	DEFAULT NULL
) RETURN VARBINARY;

参数详解

  • pad 如果 to_set 小于 from_set,少的部分用 pad 值代替。如果 pad 为 null,则转换后的结果为 null。
  1. CAST_TO_RAW

ASCII 字符转化成十六进制数字。

语法如下:

FUNCTION CAST_TO_RAW(
	C 	IN 	VARCHAR2
) RETURN VARBINARY;
  1. CAST_TO_VARCHAR2

十六进制数字转化成对应的 ASCII 字符。

语法如下:

FUNCTION CAST_TO_VARCHAR2(
	R 	IN 	VARBINARY
) RETURN VARCHAR2;
  1. CAST_TO_INT

十六进制数字转化成整型十进制。

语法如下:

FUNCTION CAST_TO_INT(
	R 			IN 		VARBINARY,
	ENDIANESS 	IN 		INTEGER  	DEFAULT 1
)RETURN  INTEGER; 

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示依次从高位向低位读取。2 和 3 表示依次从低位向高位读取。
  1. CAST_FROM_INT

整型十进制转化成十六进制数字。

语法如下:

FUNCTION CAST_FROM_INT(
	N  			IN  	INTEGER,
	ENDIANESS  	IN 		INTEGER  	DEFAULT 1
) RETURN VARBINARY;
  1. CAST_TO_BINARY_INTEGER

十六进制数字转化成整型十进制。

语法如下:

FUNCTION CAST_TO_BINARY_INTEGER (
	R 			IN 		VARBINARY,
	ENDIANESS 	IN 		INTEGER 		DEFAULT 1
)RETURN  INTEGER;

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_FROM_BINARY_INTEGER

整型十进制转化成十六进制数字。

语法如下:

FUNCTION CAST_FROM_BINARY_INTEGER (
	N  			IN  	INTEGER,
	ENDIANESS  	IN 		INTEGER  	DEFAULT 1
) RETURN VARBINARY;

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_TO_BINARY_DOUBLE

十六进制数字转化成 DOUBLE。

语法如下:

FUNCTION CAST_TO_BINARY_DOUBLE (

	R 			IN 		VARBINARY,

	ENDIANESS 	IN 		INTEGER  	DEFAULT 1

)RETURN  DOUBLE; 

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_FROM_BINARY_DOUBLE

DOUBLE 转化成十六进制数字。

语法如下:

FUNCTION CAST_BINARY_DOUBLE (
	N  			IN  	DOUBLE,
	ENDIANESS  	IN 		INTEGER  	DEFAULT 1
) RETURN VARBINARY;

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_TO_BINARY_FLOAT

十六进制数字转化成 FLOAT。

语法如下:

FUNCTION CAST_TO_BINARY_FLOAT(
	R 			IN 		VARBINARY,
	ENDIANESS 	IN 		INTEGER  	DEFAULT 1
)RETURN  FLOAT;

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_FROM_BINARY_FLOAT

FLOAT 转化成十六进制数字。

语法如下:

FUNCTION CAST_FROM_BINARY_FLOAT(
	N  			IN  	DOUBLE,
	ENDIANESS  	IN 		INTEGER  	DEFAULT 1
) RETURN VARBINARY;

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_TO_NUMBER

十六进制数字转化成 NUMBER。

语法如下:

FUNCTION CAST_TO_NUMBER(
	R 			IN 		VARBINARY,
	ENDIANESS 	IN 		INTEGER  	DEFAULT 1
)RETURN  NUMBER; 

参数详解

  • Endianess 读取 R 数据的顺序,取值范围:1、2、3,缺省为 1。1 表示使用大端方式。2 表示使用小端方式,3 表示使用机器的大小端方式。
  1. CAST_FROM_NUMBER

将 number 类型(dec、decimal)转化成十六进制数据。

语法如下:

FUNCTION CAST_FROM_NUMBER(
	N 	IN 	NUMBER
) RETURN VARBINARY;

30.2 举例说明

使用包内的过程和函数之前,如果还未创建过系统包,请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'UTL_RAW');

例 utl_FILE 包的应用。

例 1 xrange

select utl_raw.xrange(utl_raw.cast_to_raw('A'),utl_raw.cast_to_raw('Z')) from dual;

查询结果如下:

0x4142434445464748494A4B4C4D4E4F505152535455565758595A

例 2 bit_and

select utl_raw.bit_and('0102F3','F30201') from dual;

查询结果如下:

0x010201

例 3 bit_complement

select utl_raw.bit_complement('0102F3') from dual;

查询结果如下:

0xFEFD0C

例 4 bit_or

select utl_raw.bit_or('0102F3','F30201') from dual;

查询结果如下:

0xF302F3

例 5 bit_xor

select utl_raw.bit_xor('0102F3','F30201') from dual;

查询结果如下:

0xF200F2

例 6 compare

select utl_raw.compare(utl_raw.cast_to_raw('ABC'),utl_raw.cast_to_raw('ABCD'))from dual;

查询结果如下:

4

例 7 concat

select utl_raw.concat('A','41','B','42') from dual;

查询结果如下:

0x0A410B42

例 8 convert_raw

select UTL_RAW.CONVERT_raw('E4B8ADE69687', 'GBK', 'UTF8') from dual;

查询结果如下:

0xD6D0CEC4
select UTL_RAW.CONVERT_raw('D6D0CEC4','UTF8', 'GBK') from dual;

查询结果如下:

0xE4B8ADE69687

例 9 copies

select utl_raw.copies('A',6) from dual;

查询结果如下:

0x0A0A0A0A0A0A

例 10 length

select utl_raw.LEngth(UTL_RAW.CAST_TO_RAW('ABCD')) from dual;

查询结果如下:

4

例 11 overlay_raw

select utl_raw.overlay_raw
(utl_raw.cast_to_raw('D'),utl_raw.cast_to_raw('AAAC'),1,1) from dual;

查询结果如下:

0x44414143
select
utl_raw.overlay_raw(utl_raw.cast_to_raw('D'),utl_raw.cast_to_raw('AAAC'),1,2,utl_raw.cast_to_raw('
')) from dual;

查询结果如下:

0x44204143

例 12 reverse_raw

select utl_raw.reverse_raw(utl_raw.cast_to_raw('123')) from dual;

查询结果如下:

0x333231

例 13 substr

select utl_raw.substr(0x414243444541424344454142434445,6,2) from dual;

查询结果如下:

0x4142

例 14 translate

select
UTL_RAW.translate(utl_raw.cast_to_raw('aDe'),utl_raw.cast_to_raw('AD'),utl_raw.cast_to_raw('ad'))
from dual;

查询结果如下:

616465 //即ade

例 15 translITERATE

select
UTL_RAW.translITERATE(utl_raw.cast_to_raw('FaDe'),utl_raw.cast_to_raw('adef'),utl_raw.cast_to_raw('ADEF'),utl_raw.cast_to_raw('')) from dual;

查询结果如下:

66616465 //即fade

例 16 CAST_TO_RAW

select UTL_RAW.CAST_TO_RAW(10) from dual;

查询结果如下:

0x3130

例 17 cast_to_varchar2

select utl_raw.cast_to_varchar2('40') from dual;

查询结果如下:

@

例 18 cast_to_INT

select utl_raw.cast_to_int('00000064',1) from dual;

查询结果如下:

100
select utl_raw.cast_to_int('00000064',2) from dual;

查询结果如下:

1677721600

例 19 cast_from_INT

select utl_raw.cast_from_int(10) from dual;

查询结果如下:

0x0000000A
select utl_raw.cast_FROM_int(94311,2) from dual;

查询结果如下:

0x67700100

例 20 cast_from_number

select UTL_RAW.cast_FROM_number(10) from dual;

查询结果如下:

0xC10B
微信扫码
分享文档
扫一扫
联系客服