-- Función para el cálculo MD5 de una consulta pasada como parámetro:
create or replace function hash_sql(l_query varchar2) return varchar2
is
pragma autonomous_transaction;
l_theCursor integer default dbms_sql.open_cursor;
l_columnValue varchar2(32000);
l_status integer;
l_colCnt number := 0;
l_separator varchar2(1);
l_descTbl dbms_sql.desc_tab;
l_i number:=0;
l_data CLOB:='';
l_checksum CLOB:='';
begin
execute immediate 'alter session set nls_date_format=''dd/mm/yyyy hh24:mi:ss'' ';
dbms_sql.parse( l_theCursor, l_query, dbms_sql.native );
dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );
for i in 1 .. l_colCnt loop
dbms_sql.define_column( l_theCursor, i, l_columnValue, 32000 );
end loop;
l_status := dbms_sql.execute(l_theCursor);
while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
for i in 1 .. l_colCnt loop
dbms_sql.column_value( l_theCursor, i, l_columnValue );
l_i:=i;
l_data:=l_data||trim(TO_CHAR(l_columnValue));
end loop;
end loop;
dbms_sql.close_cursor(l_theCursor);
rollback;
return dbms_crypto.hash( src => l_data, typ=>dbms_crypto.hash_md5 );
exception
when others then
return 'ERROR';
end;
/
-- Llamada:
select hash_sql ('SELECT * FROM tabla where columna='||CHR(39)||'VALOR'||CHR(39)||' order by 1 ') md5 from dual
/
-- Funcionamiento/Restricciones:
A) Se basa en el uso del paquete DBMS_CRYPTO de Oracle (ver > 10g)
B) El cálculo MD5 ser realiza sobre la concatenación de todas las columnas devueltas por la consulta y concatenación fila a fila de los resultados, por ejemplo:
column1 column2
------- -------
a b
a2 b2
La cadena sobre la que se aplica el MD5 sería:
"aba2b2"
C) Cada valor de cada fila / columna se convierte en texto y se eliminan espacio finales e iniciales (TRIM(TO_CHAR(...))
D) El formato para la conversión de datos tipo fecha es: "dd/mm/yyyy hh24:mi:ss"
E) Es importante que las consultas tengan una ordenación (Ej.- "ORDER BY NLSSORT(VAL_ELE_COD, 'NLS_SORT = BINARY')"
No hay comentarios:
Publicar un comentario