因为 dbms_obfuscation_toolkit.md5
是一个 Oracle 不推荐继续使用的函数,所以 OceanBase 没有对其兼容,取而代之的是兼容了 dbms_crypto.hash
,其用法详见这篇 KB
但是,并不是所有业务都接受修改源码,因为复杂系统里,涉及到的修改点可能无法枚举。
这里提供一种临时解决方案:使用 OceanBase PL/SQL 实现一个 dbms_obfuscation_toolkit.md5
系统包,源码如下:
sql
## 创建包 DBMS_OBFUSCATION_TOOLKIT
CREATE OR REPLACE PACKAGE DBMS_OBFUSCATION_TOOLKIT
IS
FUNCTION MD5(input_string VARCHAR2)
RETURN varchar2;
END DBMS_OBFUSCATION_TOOLKIT;
/
## 创建包体 DBMS_OBFUSCATION_TOOLKIT
CREATE OR REPLACE PACKAGE BODY DBMS_OBFUSCATION_TOOLKIT
IS
FUNCTION MD5(input_string VARCHAR2)
RETURN varchar2
IS
BEGIN
RETURN UTL_RAW.CAST_TO_VARCHAR2(dbms_crypto.hash(utl_raw.cast_to_raw(input_string), 2));
END MD5;
END DBMS_OBFUSCATION_TOOLKIT;
/
测试效果如下:
sql
OceanBase(TEST@TEST)>SELECT rawtohex(dbms_crypto.hash(utl_raw.cast_to_raw('hello world'),2 /*dbms_crypto.HASH_MD5*/)) md5 FROM dual;
+----------------------------------+
| MD5 |
+----------------------------------+
| 5EB63BBBE01EEED093CB22BB8F5ACDC3 |
+----------------------------------+
1 row in set (0.000 sec)
OceanBase(TEST@TEST)>SELECT utl_raw.cast_to_raw(dbms_obfuscation_toolkit.md5(input_string => 'hello world')) md5 FROM dual;
+----------------------------------+
| MD5 |
+----------------------------------+
| 5EB63BBBE01EEED093CB22BB8F5ACDC3 |
+----------------------------------+
1 row in set (0.039 sec)
可见,上述 PL 代码完全实现了相关功能。
这个思路可以延伸到很多缺 PL 包的场景,我们很多时候可以使用自定义的 PL 包来模拟缺失的内容。当然,这个主要集中在计算领域,如果是要做一些网络 IO,就麻烦很多,比如 HTTP 相关的包,就很难模拟。