UTL_RAW
功能描述
Vastbase G100在Oracle兼容模式下支持内置包UTL_RAW,提供了一系列对raw类型数据进行处理的函数。
注意事项
该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。
cast_to_varchar2函数的输入字符须为十六进制表示形式,否则会返回识别错误。
子程序
内置包当前包含以下子程序:
函数 | 描述 | 支持版本 |
---|---|---|
cast_to_raw | 将输入的varchar2类型的数据转换成raw类型的数据,在此过程中数据并未以任何方式修改,仅仅只是修改了数据类型。 | V2.2 Build 10及以上版本 |
cast_to_varchar2 | 将输入的raw类型数据转换回varchar2类型。 | V2.2 Build 10及以上版本 |
bit_xor | 将输入的RAW r1和RAW r2中的值执行按位逻辑异或运算,并返回异或结果。 | V2.2 Build 10 (Patch No.11)及以上版本 |
length | 用于返回将输入的RAW r的字节长度。 | V2.2 Build 10 (Patch No.11)及以上版本 |
substr | 用于返回len个字节,从RAW r的pos位开始计算。 | V2.2 Build 10 (Patch No.11)及以上版本 |
cast_to_raw
语法格式
UTL_RAW.CAST_TO_RAW (
c IN VARCHAR2)
RETURN RAW;
参数说明
输入
c:被更改为RAW的VARCHAR2数据。
输出
- 当输入参数c为空时,则返回NULL。
- 当输入参数c不为空时,则返回RAW。
示例
select utl_raw.cast_to_raw('test') from dual;
返回结果为'test'字符串每个字符的ASCII码的十六进制表示形式拼接而成,结果如下:
cast_to_raw
-----------
74657374
(1 row)
cast_to_varchar2
语法格式
UTL_RAW.CAST_TO_VARCHAR2 (
r IN RAW)
RETURN VARCHAR2;
参数说明
输入
r:被更改为VARCHAR2的RAW数据,为十六进制的表现形式。
输出
- 当输入参数r为空时,则返回NULL。
- 当输入参数r不为空时,则返回RAW。
示例
select utl_raw.cast_to_varchar2('74657374') from dual;
返回结果为十六进制ASCII码'74657374'表示的字符串,结果如下:
cast_to_varchar2
----------------
test
(1 row)
cast_to_varchar2函数的输入字符必须为十六进制表现形式,否则会返回识别错误。
select utl_raw.cast_to_varchar2('test') from dual; ERROR: invalid hexadecimal digit: "t" LINE 1: select utl_raw.cast_to_varchar2('test') from dual; ∧ CONTEXT: referenced column: cast_to_varchar2
bit_xor
语法格式
UTL_RAW.bit_xor(
r1 IN RAW,
r2 IN RAW
)
RETURN RAW;
参数说明
输入
r1:与r2进行异或运算的RAW值。
r2:与r1进行异或运算的RAW值。
输出
- 传入r1或r2为空时,则返回NULL。
- 传入r1或r2不为空时,则返回r1与r2进行异或运算后的结果。
示例
1、隐式转换。
SELECT UTL_RAW.BIT_XOR('12344321','0f') from dual;
返回结果为:
bit_xor
----------
1D344321
(1 row)
2、显式转换。
SELECT UTL_RAW.BIT_XOR(hextoraw('abc'), hextoraw('cde')) from dual;
SELECT UTL_RAW.BIT_XOR(utl_raw.cast_to_raw('hello'), utl_raw.cast_to_raw('word')) from dual;
结果显示为:
bit_xor
---------
0662
(1 row)
bit_xor
------------
1F0A1E086F
(1 row)
length
语法格式
UTL_RAW.length(
r IN RAW)
RETURN NUMBER;
参数说明
输入
r:待测量字节长度的RAW。
输出
RAW的当前长度。
示例
1、隐式转换。
SELECT UTL_RAW.LENGTH('12344321') from dual;
结果显示为:
length
--------
4
(1 row)
2、显式转换。
SELECT UTL_RAW.LENGTH(hextoraw('abc')) from dual;
SELECT UTL_RAW.LENGTH(utl_raw.cast_to_raw('hello')) from dual;
结果显示为:
length
--------
2
(1 row)
length
--------
5
(1 row)
substr
语法格式
UTL_RAW.substr(
r IN RAW,
pos IN BINARY_INTEGER,
len IN BINARY_INTEGER DEFAULT NULL)
RETURN RAW;
参数说明
输入
r:从RAW中提取的部分字节的字符串。
pos:r中开始提取字节的位置。pos值不能为0。
- 如果pos为正,则substr从r的开头计数以找到第一个字节。
- 如果pos为负,则substr从r的末尾开始倒数。
len:从r提取到的字节数,从RAW r的pos位置开始计算。
入参pos和len可以传入浮点值,所以在实现中该参数类型为浮点类型FLOAT8,在函数中根据实际情况向上或向下取整得到pos、向下取整得到len。
输出
- 传入r为空时,返回NULL。
- 传入r不为空时,返回以pos位开始计算,长度为len个字节的RAW。
示例
1、len小于1的情况:
SELECT UTL_RAW.SUBSTR(utl_raw.cast_to_raw('FFFFFFFFFFFF'), 1, 0) from dual;
结果显示为:
ERROR: numeric or value error
CONTEXT: PL/pgSQL function pg_catalog.utl_raw.substr(raw,double precision,double precision) line 2 at RETURN
referenced column: substr
2、len大于raw类型的长度的情况:
SELECT UTL_RAW.SUBSTR(utl_raw.cast_to_raw('FFFFFFFFFFFF'), 1, 100) from dual;
结果显示为:
ERROR: numeric or value error
CONTEXT: PL/pgSQL function pg_catalog.utl_raw.substr(raw,double precision,double precision) line 2 at RETURN
referenced column: substr
3、len为小数的情况:
SELECT UTL_RAW.SUBSTR(utl_raw.cast_to_raw('FFFFFFFFFFFF'), 1, 1.2) from dual;
结果显示为:
substr
--------
46
(1 row)