可以使用 UTL_RAW 包操作或检索原始数据类型的长度。

说明 管理员必须先向每个用户或组授予执行特权,之后该用户或组才能使用此包。
函数/存储过程 类型 返回类型 说明
CAST_TO_RAW(c IN VARCHAR2) 函数 RAW 将 VARCHAR2 字符串转换为 RAW 值。
CAST_TO_VARCHAR2(r IN RAW) 函数 VARCHAR2 将 RAW 值转换为 VARCHAR2 字符串。
CONCAT(r1 IN RAW, r2 IN RAW, r3 IN RAW,…) 函数 RAW 将多个 RAW 值连接成一个 RAW 值。
CONVERT(r IN RAW, to_charset IN VARCHAR2, from_charset IN VARCHAR2 函数 RAW 将编码数据从一种编码转换为另一种编码,并将结果作为 RAW 值返回。
LENGTH(r IN RAW) 函数 NUMBER 返回 RAW 值的长度。
SUBSTR(r IN RAW, pos IN INTEGER, len IN INTEGER) 函数 RAW 返回 RAW 值的一部分。

与Oracle版本相比,PolarDB-O的UTL_RAW实施是部分实施。仅支持上表中列出的函数和存储过程。

CAST_TO_RAW

CAST_TO_RAW函数将VARCHAR2字符串转换为RAW值。特征为:

CAST_TO_RAW(c VARCHAR2)

如果传递非NULL值,则此函数返回RAW值;如果传递NULL值,则此函数返回NULL。

参数

参数 说明
c 将转换为RAW的VARCHAR2值。

示例

以下示例使用CAST_TO_RAW函数将VARCHAR2字符串转换为RAW值:

DECLARE
  v VARCHAR2;
  r RAW;
BEGIN
  v := 'Accounts';
  dbms_output.put_line(v);
  r := UTL_RAW.CAST_TO_RAW(v);
  dbms_output.put_line(r);
END;

结果集包含原始字符串的内容以及转换的RAW值:

Accounts
\x4163636f756e7473

CAST_TO_VARCHAR2

CAST_TO_VARCHAR2函数将RAW数据转换为VARCHAR2数据。特征为:

CAST_TO_VARCHAR2(r RAW)

如果传递非NULL值,则此函数返回VARCHAR2值;如果传递NULL值,则此函数返回NULL。

参数

参数 说明
r 将转换为VARCHAR2值的RAW值。

示例

以下示例使用CAST_TO_VARCHAR2函数将RAW值转换为VARCHAR2字符串:

DECLARE
  r RAW;
  v VARCHAR2;
BEGIN
  r := '\x4163636f756e7473'
  dbms_output.put_line(v);
  v := UTL_RAW.CAST_TO_VARCHAR2(r);
  dbms_output.put_line(r);
END;

结果集包含原始字符串的内容以及转换的RAW值:

\x4163636f756e7473
Accounts

CONCAT

CONCAT函数将多个RAW值连接成一个RAW值。特征为:

CONCAT(r1 RAW, r2 RAW, r3 RAW,…)

此函数返回RAW值。与Oracle实施不同,PolarDB-O实施是一种可变参数函数,并且不会限制可连接起来的值的数量。

参数

参数 说明
r1, r2, r3,… CONCAT将连接的RAW值。

示例

以下示例使用CONCAT函数将多个RAW值连接成一个RAW值:

SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONCAT('\x61', '\x62', '\x63')) FROM DUAL;  concat
--------  abc(1 row)

随后,CAST_TO_VARCHAR2函数会将结果(连接的值)转换为VARCHAR2格式。

CONVERT

CONVERT函数将字符串从一种编码转换为另一种编码,并将结果作为RAW值返回。特征为:

CONVERT(r RAW, to_charset VARCHAR2, from_charset VARCHAR2)

此函数返回RAW值。

参数

参数 说明
r 将转换的RAW值。
to_charset r将转换为的编码的名称。
from_charset r将执行转换的源编码的名称。

示例

以下示例使用UTL_RAW.CAST_TO_RAW函数将VARCHAR2字符串(Accounts)转换为原始值,然后将该值从UTF8转换为LATIN7,再将其从LATIN7转换为UTF8:

DECLARE   r RAW;   v VARCHAR2;BEGIN   v:= 'Accounts';   dbms_output.put_line(v);
  r:= UTL_RAW.CAST_TO_RAW(v);   dbms_output.put_line(r);   r:= UTL_RAW.CONVERT(r, 'UTF8', 'LATIN7');   dbms_output.put_line(r);   r:= UTL_RAW.CONVERT(r, 'LATIN7', 'UTF8');   dbms_output.put_line(r);

此示例返回VARCHAR2值、RAW值和转换的值:

Accounts
\x4163636f756e7473
\x4163636f756e7473
\x4163636f756e7473

LENGTH

LENGTH函数返回RAW值的长度。特征为:

LENGTH(r RAW)

此函数返回RAW值。

参数

参数 说明
r LENGTH将计算的RAW值。

示例

以下示例使用LENGTH函数返回RAW值的长度:

SELECT UTL_RAW.LENGTH(UTL_RAW.CAST_TO_RAW('Accounts')) FROM DUAL;  length
--------8(1 row)

以下示例使用LENGTH函数返回包含多字节字符的RAW值的长度:

SELECT UTL_RAW.LENGTH(UTL_RAW.CAST_TO_RAW('独孤求败'));
 length
--------
     12
(1 row)

SUBSTR

SUBSTR函数返回RAW值的子字符串。特征为:

SUBSTR (r RAW, pos INTEGER, len INTEGER)

此函数返回RAW值。

参数

参数 说明
r 将从中返回子字符串的RAW值。
pos 返回的子字符串的第一个字节的RAW值中的位置。
  • 如果pos为0或1,则子字符串从RAW值的第一个字节开始。
  • 如果pos大于1,则子字符串从pos指定的第一个字节开始。例如,如果pos为3,则子字符串从值的第三个字节开始。
  • 如果pos为负数,则子字符串从源值末尾算起的pos字节开始。例如,如果pos为-3,则子字符串从值末尾算起的第三个字节开始。
len 将返回的最大字节数。

示例

以下示例使用SUBSTR函数选择一个从RAW值开头开始的3个字节的子字符串:

SELECT UTL_RAW.SUBSTR(UTL_RAW.CAST_TO_RAW('Accounts'), 3, 5) FROM DUAL;
 substr--------  count(1 row)

以下示例使用SUBSTR函数选择一个从RAW值结尾开始的5个字节的子字符串:

SELECT UTL_RAW.SUBSTR(UTL_RAW.CAST_TO_RAW('Accounts'), -5 , 3) FROM DUAL;
 substr
--------
 oun
(1 row)