gpt4 book ai didi

oracle - Oracle 中的 MD5 (DBMS_OBFUSCATION_TOOLKIT.MD5)

转载 作者:行者123 更新时间:2023-12-04 22:00:43 26 4
gpt4 key购买 nike

我正在尝试编写一个函数来从我在这里和那里收集的位中获取 MD5 哈希值。我想获得散列的小写十六进制表示。到目前为止我有这个:

CREATE OR REPLACE FUNCTION MD5 (
CADENA IN VARCHAR2
) RETURN DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM
AS
BEGIN
RETURN LOWER(
RAWTOHEX(
UTL_RAW.CAST_TO_RAW(
DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => CADENA)
)
)
);
END;

我不确定函数的返回类型。 DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM 看起来是合适的选择,据我所知它按预期工作,但 SQL Developer 显示的 dbms_obfuscation_toolkit 包定义显示了这一点:
SUBTYPE varchar2_checksum IS VARCHAR2(16);

输出有 32 个字符,所以我一定是做错了什么。我的问题:
  • RETURN 语句的正确类型是什么?
  • 我是否进行了不必要的转换来计算散列?
  • 最佳答案

    不能限制存储过程参数和函数返回类型是 Oracle PL/SQL 的一个特性。也就是说,我们不能有这样一个签名的过程:

    SQL> create or replace procedure my_proc (p1 in varchar2(30))
    2 is
    3 begin
    4 null;
    5 end;
    6 /

    Warning: Procedure created with compilation errors.

    SQL> show error
    Errors for PROCEDURE MY_PROC:

    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    1/34 PLS-00103: Encountered the symbol "(" when expecting one of the
    following:
    := . ) , @ % default character
    The symbol ":=" was substituted for "(" to continue.

    SQL> create or replace procedure my_proc (p1 in varchar2)
    2 is
    3 begin
    4 null;
    5 end;
    6 /

    Procedure created.

    SQL>

    当然,我们可以使用 SUBTYPE 定义过程的参数,但 Oracle 会忽略它。函数返回类型也是如此......
    SQL> create or replace package my_subtypes as
    2 subtype ltd_string is varchar2(30);
    3 end;
    4 /

    Package created.

    SQL> create or replace function my_func return my_subtypes.ltd_string
    2 is
    3 begin
    4 return lpad('a', 4000, 'a');
    5 end;
    6 /

    Function created.

    SQL> select length(my_func) from dual
    2 /

    LENGTH(MY_FUNC)
    ---------------
    4000

    SQL>

    限制参数和返回类型的唯一方法是在存储过程中使用子类型声明变量。使用包内的变量,并将它们分配给 OUT 参数(或返回函数的变量)。

    这是一种冗长的说法,您可以在代码中使用 DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM 确信它不会阻止您的函数返回 32 个字符。

    但是,这会使将查找SUBTYPE声明的开发人员感到困惑。在最坏的情况下,这些人将使用子类型声明他们自己的工作变量,并带来以下悲惨的结果:
    SQL> declare
    2 v my_subtypes.ltd_string;
    3 begin
    4 v := my_func;
    5 end;
    6 /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 4


    SQL>

    因此,最好不要使用不合适的子类型。而是声明你自己的。

    关于oracle - Oracle 中的 MD5 (DBMS_OBFUSCATION_TOOLKIT.MD5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897438/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com