首页 » ORACLE 9i-23ai, PostgreSQL/GaussDB » Migrate oracle to openGauss: cast_to_raw/cast_to_varchar2 & base64_encode/base64_decode functions
Migrate oracle to openGauss: cast_to_raw/cast_to_varchar2 & base64_encode/base64_decode functions
我和我的团队最近在迁移oracle到openGauss(postgresql)时, 发现有一些存储过程中使用了加密函数,其中有一些涉及到编码的package 如utl_i18、utl_raw、utl_encode,对一些明文数值进行raw或base64编码,这里记录一下oracle到opengauss后对应的函数实现, 基本也适用于postgresql,下一篇会记录加密函数。
cast_to_raw cast_to_varchar2
oracle
FUNCTION CAST_TO_RAW RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- C VARCHAR2 IN FUNCTION CAST_TO_VARCHAR2 RETURNS VARCHAR2 Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R RAW IN --转换RAW SQL> select utl_raw.cast_to_raw('abc'); UTL_RAW.CAST_TO_RAW('ABC') -------------------------------------------------------------------- 616263 -- 逆转RAW SQL> select utl_raw.cast_to_varchar2('616263'); UTL_RAW.CAST_TO_VARCHAR2('616263') ---------------------------------------------------------------------- abc
opengauss
--转换RAW openGauss=# \df encode List of functions Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind ------------+--------+------------------+---------------------+--------+------------+------------+--------- pg_catalog | encode | text | bytea, text | normal | f | f | f (1 row) openGauss=# select encode('abc','hex'); encode -------- 616263 (1 row) openGauss=# \df rawtohex List of functions Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind ------------+----------+------------------+---------------------+--------+------------+------------+--------- pg_catalog | rawtohex | text | raw | normal | f | f | f pg_catalog | rawtohex | text | text | normal | f | f | f (2 rows) openGauss=# select rawtohex('abc'); rawtohex ---------- 616263 (1 row) openGauss=# select rawtohex('abc')::raw; rawtohex ---------- 616263 -- 逆转RAW openGauss=# \df rawsend List of functions Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind ------------+---------+------------------+---------------------+--------+------------+------------+--------- pg_catalog | rawsend | bytea | raw | normal | f | f | f (1 row) openGauss=# \df convert_from List of functions Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind ------------+--------------+------------------+---------------------+--------+------------+------------+--------- pg_catalog | convert_from | text | bytea, name | normal | f | f | f (1 row) openGauss=# \df pg_encoding_to_char List of functions Schema | Name | Result data type | Argument data types | Type | fencedmode | propackage | prokind ------------+---------------------+------------------+---------------------+--------+------------+------------+--------- pg_catalog | pg_encoding_to_char | name | integer | normal | f | f | f (1 row) openGauss=# select encoding from pg_database where datname=current_database(); encoding ---------- 7 (1 row) openGauss=# select encoding , pg_encoding_to_char(encoding) as encoding from pg_database where datname=current_database(); encoding | encoding ----------+---------- 7 | UTF8 (1 row) openGauss=# SELECT convert_from(rawsend('616263'),'UTF8') ; convert_from -------------- abc (1 row)
Note:
在opengauss 的A for oracle兼容模式的decode不是postgresql中的解码,而是雷同oracle中的decode,case wen then函数。
utl_encode.base64_encode utl_encode.base64_decode
oracle
---编码 SQL> desc utl_encode FUNCTION BASE64_DECODE RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R RAW IN FUNCTION BASE64_ENCODE RETURNS RAW Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- R RAW IN SQL> @printtab "select utl_raw.cast_to_raw(''今天访问www.anbob.com了吗?'') ev1, utl_encode.base64_encode(utl_raw.cast_to_raw(''今天访问www.anbob.com了吗?'')) ev2, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(''今天访问www.anbob.com了吗?''))) ev3 , utl_i18n.STRING_TO_RAW(''今天访问www.anbob.com了吗?'',''ZHS16GBK'') ev4 from dual" EV1 : E4BB8AE5A4A9E8AEBFE997AE7777772E616E626F622E636F6DE4BA86E590973F EV2 : 354C754B35615370364B362F365A6575643364334C6D4675596D39694C6D4E7662655336687557516C7A383D EV3 : 5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8= EV4 : E4BB8AE5A4A9E8AEBFE997AE7777772E616E626F622E636F6DE4BA86E590973F ----------------- PL/SQL procedure successfully completed. --解码 SQL> @printtab "select utl_raw.cast_to_raw(''5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8='') v1, utl_encode.base64_decode(utl_raw.cast_to_raw(''5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8='')) v2, utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(''5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8=''))) v3 from dual"; V1 : 354C754B35615370364B362F365A6575643364334C6D4675596D39694C6D4E7662655336687557516C7A383D V2 : E4BB8AE5A4A9E8AEBFE997AE7777772E616E626F622E636F6DE4BA86E590973F V3 : 今天访问www.anbob.com了吗? ----------------- PL/SQL procedure successfully completed.
openGauss
---编码 openGauss=# \x Expanded display is on. openGauss=# SELECT rawtohex('今天访问www.anbob.com了吗?')::raw, encode(rawsend(rawtohex('今天访问www.anbob.com了吗?')::raw),'base64'), rawtohex(encode(rawsend(rawtohex('今天访问www.anbob.com了吗?')::raw),'base64'))::RAW, convert_from(rawsend(rawtohex(encode(rawsend(rawtohex('今天访问www.anbob.com了吗?')::raw),'base64'))::RAW),'UTF8') ; -[ RECORD 1 ]+----------------------------------------------------------------------------------------- rawtohex | E4BB8AE5A4A9E8AEBFE997AE7777772E616E626F622E636F6DE4BA86E590973F encode | 5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8= rawtohex | 354C754B35615370364B362F365A6575643364334C6D4675596D39694C6D4E7662655336687557516C7A383D convert_from | 5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8= --解码 openGauss=# SELECT rawtohex('5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8='), encode(rawsend(rawtohex('5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8=')::RAW),'escape'), decode('5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8=','base64')::BYTEA, rawout(decode('5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8=','base64')::BYTEA)::TEXT::RAW, convert_from(rawsend(rawout(decode('5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8=','base64')::BYTEA)::TEXT::RAW),'UTF8'); -[ RECORD 1 ]+----------------------------------------------------------------------------------------- rawtohex | 354c754b35615370364b362f365a6575643364334c6d4675596d39694c6d4e7662655336687557516c7a383d encode | 5LuK5aSp6K6/6Zeud3d3LmFuYm9iLmNvbeS6huWQlz8= decode | \xe4bb8ae5a4a9e8aebfe997ae7777772e616e626f622e636f6de4ba86e590973f rawout | E4BB8AE5A4A9E8AEBFE997AE7777772E616E626F622E636F6DE4BA86E590973F convert_from | 今天访问www.anbob.com了吗?
— enjoy —
对不起,这篇文章暂时关闭评论。