为了在DM上兼容oracle的utl_raw包,提供功能上与oracle基本一致的utl_raw包。利用这个包提供将十六进制类型转化为其它数据类型的函数和一系列十六进制类型相关函数。
30.1 相关方法
utl_raw包所支持的20个函数,分别实现十六进制的相关转化函数。这些函数通过调用相应系统内部函数来实现存取数据的过程。如下详细介绍各函数:
- 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。
- 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数据。
- BIT_OR
输出r1与r2的按位运算的逻辑或。
语法如下:
FUNCTION BIT_OR(
r1 IN varbinary,
r2 IN varbinary
) RETURN varbinary;
参数详解
- r1输入参数,varbinary数据。
- r2输入参数,varbinary数据。
注意:如果r1、r2长度不等,则对长度较小的参数低位补0X00字节至与另一个参数对齐后再做按位运算。
- BIT_XOR
输出r1与r2的按位运算的逻辑异或。
语法如下:
FUNCTION bit_xor(
r1 IN varbinary,
r2 IN varbinary
) RETURN varbinary;
参数详解
- r1输入参数,varbinary数据。
- r2输入参数,varbinary数据。
注意:如果r1、r2长度不等,则对长度较小的参数低位补0X00字节至与另一个参数对齐后再做按位运算。
- 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右数据源串所在列名。
- 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;
- 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)的相互转换。
- COPIES
将十六进制串数值拷贝n次,依次排在前一个数的后面。返回新的十六进制数值。
语法如下:
FUNCTION copies(
r IN varbinary,
n IN NUMBER
) RETURN varbinary;
- LENGTH
返回十六进制串的字节长度。
语法如下:
FUNCTION length(
r IN varbinary
) RETURN NUMBER;
- 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值代替。
- REVERSE_RAW
将输入十六进制串的字符顺序反转后返回。
语法如下:
FUNCTION reverse_RAW (
r IN varbinary
) RETURN varbinary;
- SUBSTR
返回十六进制串中从字节位置POS开始的LEN个字节。
语法如下:
FUNCTION substr(
r IN varbinary,
pos IN INTEGER,
len IN INTEGER DEFAULT NULL
) RETURN varbinary;
- 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替换后的字符串。
- 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。
- CAST_TO_RAW
ASCII字符转化成十六进制数字。
语法如下:
FUNCTION cast_to_raw(
c IN VARCHAR2
) RETURN varbinary;
- CAST_TO_VARCHAR2
十六进制数字转化成对应的ASCII字符。
语法如下:
FUNCTION cast_to_varchar2(
r IN varbinary
) RETURN VARCHAR2;
- 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表示依次从低位向高位读取。
- CAST_FROM_INT
整型十进制转化成十六进制数字。
语法如下:
FUNCTION cast_from_int(
n IN INTEGER,
endianess IN INTEGER DEFAULT 1
) RETURN varbinary;
- 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表示使用机器的大小端方式。
- 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表示使用机器的大小端方式。
- 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表示使用机器的大小端方式。
- 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表示使用机器的大小端方式。
- 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表示使用机器的大小端方式。
- 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表示使用机器的大小端方式。
- 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表示使用机器的大小端方式。
- 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包的应用。
- xrange
select utl_raw.xrange(utl_raw.cast_to_raw('A'),utl_raw.cast_to_raw('Z')) from dual;
询结果:
0x4142434445464748494A4B4C4D4E4F505152535455565758595A
- bit_and
select utl_raw.bit_and('0102F3','F30201') from dual;
查询结果:
0x010201
- bit_complement
select utl_raw.bit_complement('0102F3') from dual;
查询结果:
0xFEFD0C
- bit_or
select utl_raw.bit_or('0102F3','F30201') from dual;
查询结果:
0xF302F3
- bit_xor
select utl_raw.bit_xor('0102F3','F30201') from dual;
查询结果:
0xF200F2
- compare
select utl_raw.compare(utl_raw.cast_to_raw('ABC'),utl_raw.cast_to_raw('ABCD'))from dual;
查询结果:
4
- concat
select utl_raw.concat('A','41','B','42') from dual;
查询结果:
0x0A410B42
- convert_raw
select UTL_RAW.CONVERT_raw('E4B8ADE69687', 'GBK', 'UTF8') from dual;
查询结果:
0xD6D0CEC4
select UTL_RAW.CONVERT_raw('D6D0CEC4','UTF8', 'GBK') from dual;
查询结果:
0xE4B8ADE69687
- copies
select utl_raw.copies('A',6) from dual;
查询结果:
0x0A0A0A0A0A0A
- length
select utl_raw.LEngth(UTL_RAW.CAST_TO_RAW('ABCD')) from dual;
查询结果:
4
- 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
- reverse_raw
select utl_raw.reverse_raw(utl_raw.cast_to_raw('123')) from dual;
查询结果:
0x333231
- substr
select utl_raw.substr(0x414243444541424344454142434445,6,2) from dual;
查询结果:
0x4142
- 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
- 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
- CAST_TO_RAW
select UTL_RAW.CAST_TO_RAW(10) from dual;
查询结果:
0x3130
- cast_to_varchar2
select utl_raw.cast_to_varchar2('40') from dual;
查询结果:
@
- 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
- cast_from_INT
select utl_raw.cast_from_int(10) from dual;
查询结果:
0x0000000A
select utl_raw.cast_FROM_int(94311,2) from dual;
查询结果:
0x67700100
- cast_from_number
select UTL_RAW.cast_FROM_number(10) from dual;
查询结果:
0xC10B