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)