VastbaseG100

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

Menu

UTL_ENCODE

功能描述

UTL_ENCODE包提供了将原始数据编码转换为标准编码格式的函数,以便数据可以在主机之间传输。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。

  • 使用该内置包的功能需要配置python3环境并创建plpython3u插件,步骤参考python3环境配置

子程序

表1 UTL_ENCODE包支持的函数

函数 描述
BASE64_ENCODE 实现对RAW类型内容的加密,返回加密密文。
BASE64_DECODE 读取BASE64编码的输入字符串,并解码为其原始值RAW。
MIMEHEADER_ENCODE 将字符串编码为MIME格式。
QUOTED_PRINTABLE_DECODE 对RAW格式的经过quoted-printable编码后的字符串进行解码。
TEXT_DECODE 解码字符集敏感文本字符串。
UUDECODE 读取UUENCODE格式的输入字符串并将其解码为相应的字符串RAW。

BASE64_ENCODE

语法格式

UTL_ENCODE.BASE64_ENCODE (
   r  IN RAW) 
RETURN RAW;

参数说明

r:RAW格式的字符串。

返回值

BASE64编码的RAW格式字符串。

示例

直接调用UTL_ENCODE.BASE64_ENCODE函数。

select utl_encode.base64_encode('A1110BCD5556abc779999ddddeeeeeaaaa41ABC77900');

返回结果如下:

                          base64_encode
------------------------------------------------------------------
 6F52454C7A565657713864356D5A336433753775717170427138643541413D3D
(1 row)

BASE64_DECODE

语法格式

UTL_ENCODE.BASE64_DECODE (
   r  IN RAW) 
RETURN RAW;

参数说明

r:base64编码的数据的RAW字符串。

返回值

解码后的RAW字符串。

示例

直接调用UTL_ENCODE.BASE64_DECODE函数。

select UTL_ENCODE.BASE64_DECODE( HEXTORAW ( '24344' )) FROM DUAL;

返回结果如下:

 base64_decode
---------------
 08
(1 row)

MIMEHEADER_ENCODE

此函数返回一个“编码单词”作为输出。

输出采用以下形式:

=?<charset>?<encoding>?<encoded text>?= 
=?ISO-8859-1?Q?Here is some text?= 

语法格式

UTL_ENCODE.MIMEHEADER_ENCODE (
   buf            IN  VARCHAR2 CHARACTER SET ANY_CS, 
   encode_charset IN  VARCHAR2 DEFAULT NULL, 
   encoding       IN  PLS_INTEGER DEFAULT NULL) 
 RETURN string VARCHAR2 CHARACTER SET buf%CHARSET;

参数说明

  • buf

    待编码文本数据。

  • encode_charset

    用于编码的字符集,NULL表示使用数据库的字符集。

  • encoding

    编码格式。

    有效值为:

    • 1:表示base64

    • 2:表示quoted_printable

    默认值:quoted_printable

示例

直接调用UTL_ENCODE.MIMEHEADER_ENCODE函数。

select utl_encode.mimeheader_encode('Here is some encoded text','GBK') from dual;
select utl_encode.mimeheader_encode('49848asdASDAS-0-@#$%^','UTF8') from dual;
select utl_encode.mimeheader_encode('49848asdASDAS-0-@#$%^','ASCII') from dual;

返回结果如下:

          mimeheader_encode
-------------------------------------
 =?GBK?Q?Here is some encoded text?=
(1 row)

        mimeheader_encode
----------------------------------
 =?UTF8?Q?49848asdASDAS-0-@#$%^?=
(1 row)

         mimeheader_encode
-----------------------------------
 =?ASCII?Q?49848asdASDAS-0-@#$%^?=
(1 row)

QUOTED_PRINTABLE_DECODE

语法格式

UTL_ENCODE.QUOTED_PRINTABLE_DECODE (
   r  IN RAW)
RETURN RAW;

参数说明

r:quoted-printable编码后的RAW字符串。

返回值

解码后的RAW字符串。

示例

直接调用UTL_ENCODE.QUOTED_PRINTABLE_DECODE函数。

select UTL_ENCODE.QUOTED_PRINTABLE_DECODE( HEXTORAW ( 'f88fffff' )) FROM DUAL;

返回结果如下:

 quoted_printable_decode
-------------------------
 F88FFFFF
(1 row)

TEXT_DECODE

语法格式

UTL_ENCODE.TEXT_DECODE(
   buf            IN  VARCHAR2 CHARACTER SET ANY_CS, 
   encode_charset IN  VARCHAR2 DEFAULT NULL, 
   encoding       IN  PLS_INTEGER DEFAULT NULL) 
 RETURN string VARCHAR2 CHARACTER SET buf%CHARSET;

参数说明

  • buf

    已经编码好的文本数据。

  • encode_charset

    源文本数据字符集。

  • encoding

    编码格式。

    有效值为:

    • 1:表示base64

    • 2:表示quoted_printable

    默认值:quoted_printable

示例

直接调用UTL_ENCODE.TEXT_DECODE函数。

select utl_encode.TEXT_DECODE('Here is some encoded text') from dual;
select utl_encode.TEXT_DECODE('49848asdASDAS-0-@#$%^') from dual;

返回结果如下:

        text_decode
---------------------------
 Here is some encoded text
(1 row)

      text_decode
-----------------------
 49848asdASDAS-0-@#$%^
(1 row)

UUDECODE

语法格式

UTL_ENCODE.UUDECODE (
   r  IN RAW) 
RETURN RAW;

参数说明

r:已经编码好的文本数据。

示例

直接调用UTL_ENCODE.UUDECODE函数。

select utl_raw.cast_to_varchar2(UTL_ENCODE.UUDECODE( '626567696E2030207575656E636F64652E7478740D0A2E594B362B5A2A5E352D333941392020200D0A0A656E64')) FROM DUAL;

utl_raw.cast_to_varchar2函数用于将字符串转换为RAW值。

返回结果如下:

 cast_to_varchar2
------------------
 测试56ad
(1 row)

示例

前置步骤

1、系统已经安装python3环境,以便后续创建plpython3u插件,参考python3环境配置

2、使用vsql工具连接至客户端。

vsql -d vastbase -p 5432 -r

3、创建plpython3u插件。

CREATE EXTENSION plpython3u;

示例1: 使用自定义函数调用UTL_ENCODE内置包中的函数。

1、创建测试表,插入RAW类型数据。

create table raw_test (raw_date raw(10));
insert into raw_test values (utl_raw.cast_to_raw('051'));
create table raw2_test(text varchar);
insert into raw2_test values('zhangsan');

2、创建调用了UTL_ENCODE.UUDECODE函数的自定义函数。

create or replace function func1() return raw
as
t_raw raw(50);
begin
select UTL_ENCODE.UUDECODE(raw_date) from raw_test into t_raw ;
dbms_output.put_line('t_time: '|| t_raw );
return t_raw;
end;
/

3、调用自定义函数。

select func1 ();

返回结果如下,读取了UUENCODE格式的输入字符串并将其解码为相应的字符串RAW。

 func1
-------
  5510
(1 row)

4、创建调用了UTL_ENCODE.BASE64_DECODE函数的自定义函数。

create or replace function func2() return raw
as
t_raw raw(50);
begin
select UTL_ENCODE.BASE64_DECODE(raw_date) from raw_test into t_raw ;
dbms_output.put_line('t_time: '|| t_raw );
return t_raw;
end;
/

5、调用自定义函数。

select func2 ();

返回结果如下,读取BASE64编码的输入字符串,解码为其原始值RAW并输出。

 func2
-------
  D39D
(1 row)

6、创建调用了QUOTED_PRINTABLE_DECODE函数的方法。

create or replace function func3() return raw
as
t_raw raw(50);
begin
select UTL_ENCODE.QUOTED_PRINTABLE_DECODE(raw_date) from raw_test into t_raw ;
dbms_output.put_line('t_time: '|| t_raw );
return t_raw;
end;
/

7、调用自定义函数。

select func3 ();

返回结果如下,对经过quoted-printable编码后的字符串进行了解码。

 func3
-------
303531
(1 row)

8、创建调用了TEXT_DECODE函数的自定义函数。

create or replace function func4() return varchar2
as
t_raw varchar2;
begin
select UTL_ENCODE.TEXT_DECODE(text) from raw2_test into t_raw ;
dbms_output.put_line('t_time: '|| t_raw );
return t_raw;
end;
/

9、调用自定义函数。

select func4 ();

解码结果如下:

 func4
-------
zhangsan
(1 row)

10、创建调用了MIMEHEADER_ENCODE函数的自定义函数。

create or replace function func5() return varchar2
as
t_raw varchar2;
begin
select UTL_ENCODE.MIMEHEADER_ENCODE(text) from raw2_test into t_raw ;
dbms_output.put_line('t_time: '|| t_raw );
return t_raw;
end;
/

11、调用自定义函数。

select func5 ();

返回结果如下,将字符串编码为MIME格式。

     func5
------------------
=?UTF8?zhangsan?=
(1 row)

示例2: 通过UTL_ENCODE.BASE64_ENCODE函数实现对RAW类型内容的加密,并返回加密密文。

1、创建自定义函数。

create or replace function func1_1141548(a1 in varchar, a2 varchar2)return varchar2
as
var1 varchar(2000):='9875643210';
var2 varchar(2000):='ABCabcdefghijklmnopqrstuvwxyz';
var3 varchar(2000):='!@#$%^&*()/*-+';
var4 varchar(2000):='订购测试';
var5 varchar(2000);
base64_data varchar2(2000);
begin
var5 = 'AccessUserId=' || a1 || '&Token=' || a2 || '&Appid=' || var1 || '&EmployeeId=' || var2 || '&Signature=' || var3 || '&CorpPayType=public' || '&InitPage=' || var4 || '&Callback=https%3A%2F%2Fct.ctrip.com%2Fm';
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(var5))) into base64_data from dual;
return base64_data;
end;
/

2、调用自定义函数。

call func1_1141548('77777777PPPPPIIJKL','123WSCVB'); 

返回的加密密文如下:

                        func1_1141548

--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------
QWNjZXNzVXNlcklkPTc3Nzc3Nzc3UFBQUFBJSUpLTCZUb2tlbj0xMjNXU0NWQiZBcHBpZD05ODc1NjQzMjEwJkVtcGxveWVlSWQ9QUJDYWJjZ
GVmZ2hpamtsbW5vcHFyc3R1dnd4eXomU2lnbmF0dXJlPSFAIyQlXiYqKCkvKi0rJkNvcnBQYXlUeXBlPXB1YmxpYyZJbml0UGFnZT3orqLotK3
mtYvor5UmQ2FsbGJhY2s9aHR0cHMlM0ElMkYlMkZjdC5jdHJpcC5jb20lMkZt
(1 row)