VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

UTL_RAW

功能描述

Vastbase G100在Oracle兼容模式下支持内置包UTL_RAW,提供了一系列对raw类型数据进行处理的函数。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。

  • cast_to_varchar2函数的输入字符须为十六进制表示形式,否则会返回识别错误。

子程序

内置包当前包含以下子程序:

函数 描述
cast_to_raw 将输入的varchar2类型的数据转换成raw类型的数据,在此过程中数据并未以任何方式修改,仅仅只是修改了数据类型。
cast_to_varchar2 将输入的raw类型数据转换回varchar2类型。
bit_xor 将输入的RAW r1和RAW r2中的值执行按位逻辑异或运算,并返回异或结果。
length 用于返回将输入的RAW r的字节长度。
substr 用于返回len个字节,从RAW r的pos位开始计算。

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)