es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función de conversión a MD5 no funciona dentro de una función SQL Oracle.

Necesito marcar algunos datos hash en md5 dentro de una función.

Tengo la tabla BDMTMPMAIL_HARD que contiene algunos correos. Necesito hacer coincidir algunos correos de otra tabla en md5 con los correos de esta tabla.

Mi tabla con correos en md5

EMAILMD5 MATCH
8747e564eb53cb2f1dcb9aae0779c2aa 1
4545e564eqsqdsb2f1dcb46ae0779c2aa 0

Tabla BDMTMPMAIL_HARD

MAIL TO_MD5(MAIL)
exemple@gmail.com 8747e564eb53cb2f1dcb9aae0779c2aa
example2@sfr.fr 368e564eqsq4242f1dc344242d79c2aa

Uso una función, tomada de otro paquete, llamada ‘tomd5′ que convierte el correo en md5. Por lo tanto, utilizaré esta función en la tabla BDMTMPMAIL_HARD.

El problema es que cuando ejecuto la función, nunca termina.

He realizado varias pruebas, y la cuenta de selección está correcta. Si intento hacer la actualización sin la función, funciona. Si ejecuto la función sin el to_md5(), funciona.

Solo si incluyo dentro de la función to_md5, la función nunca termina.

¿Por qué la función funciona sin la función tomd5()?

UPDATE MY_TABLE SET MATCH =
FILTRE_MARKET_OP.FILTRE_V1_MARKET_OP_MD5(lower(emailMD5));

“`
FUNCTION FILTRE
V1MARKETOPMD5(mail IN varchar) RETURN NUMBER IS
hard number;
mail
filtre varchar2(300);
BEGIN
hard := 0;
mail_filtre := mail;

SELECT count(*) INTO hard FROM BDM_TMP_MAIL_HARD
WHERE  EMAIL IS NOT NULL
AND    to_md5(email) = mail_filtre;

IF hard >= 1 THEN
    hard := 1;
    GOTO FIN;       
END IF;

<<FIN>>  
RETURN hard;

END FILTREV1MARKETOPMD5;

De lo contrario, como esto no funciona, hago la actualización manualmente de esta manera:

update MYTABLE set MATCH = 1
where lower(emailMD5) in
( select to
md5(lower(EMAIL))
from BDMTMPMAILHARD
where EMAIL is not null )
and emailMD5 is not null;

Y esta es mi función md5 personalizada:

create or replace FUNCTION to
MD5 (str IN VARCHAR2)
RETURN VARCHAR2
IS
vchecksum VARCHAR2(32);
BEGIN
v
checksum := LOWER( RAWTOHEX( UTLRAW.CASTTORAW( sys.dbmsobfuscationtoolkit.md5(inputstring => str) ) ) );
RETURN vchecksum;
EXCEPTION
WHEN NO
DATAFOUND THEN
NULL;
WHEN OTHERS THEN
— Consider logging the error and then re-raise
RAISE;
END to
MD5;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para marcar algunos datos encriptados en MD5 dentro de una función, podemos utilizar el siguiente código:

    UPDATE MY_TABLE SET MATCH =
        FILTRE_MARKET_OP.FILTRE_V1_MARKET_OP_MD5(lower(emailMD5));
    

    Sin embargo, parece haber un problema con la función to_md5(), lo cual causa que la función nunca termine cuando se utiliza dentro de FILTRE_V1_MARKET_OP_MD5. Para solucionar este problema, la actualización se puede realizar manualmente con el siguiente código:

    update MY_TABLE set MATCH = 1
    where  lower(emailMD5) in
           ( select to_md5(lower(EMAIL))
             from   BDM_TMP_MAIL_HARD
             where  EMAIL is not null )
    and    emailMD5 is not null;
    

    La función to_MD5 convierte una entrada de cadena en su valor hash MD5.

Comments are closed.