Comparación de CLOBs de Oracle en la misma fila.
Tengo una tabla que contiene algunas columnas y dos CLOBS.
En algunos casos, ambos CLOBS contienen los mismos valores exactos y en otros casos contienen valores diferentes.
o uno o ambos CLOBS pueden estar vacíos o ser NULl.
He creado una función, que me gustaría llamar para comparar ambos CLOBS y determinar si los valores son ‘IGUALES’ o diferentes.
CREATE or REPLACE FUNCTION HASH_SHA512 (
psINPUT IN VARCHAR2
) RETURN VARCHAR2 AS
rHash RAW (512);
BEGIN
rHash := DBMS_CRYPTO.HASH (TO_CLOB (psINPUT),
dbms_crypto.HASH_SH512);
RETURN (LOWER (RAWTOHEX (rHash)));
END HASH_SHA512;
/
CREATE table table_x(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
val NUMBER,
clob1 CLOB,
clob2 CLOB);
insert into table_x (val, clob1, clob2) values (1,’aaaaaaaaaa’,’aaaaaaaaaa’);
insert into table_x (val, clob1, clob2) values (1,’aaaaa’,’aaaaaaaaaa’);
insert into table_x (val, clob1, clob2) values (2,’Xaaaaaaaaa’,’aaaaaaaaaa’);
Resultado esperado
SEQ_NUM VAL CLOB1 CLOB2
1 1 aaaaaaaaaa aaaaaaaaaa IGUALES
2 1 aaaaa aaaaaaaaaa DIFERENTES
3 2 Xaaaaaaaaa aaaaaaaaaa DIFERENTES
Basándome en el resultado de la consulta anterior, si la salida de SHA512 muestra que la diferencia es la misma, quiero INSERTAR 1 fila en la nueva tabla a continuación. Si la salida es diferente, quiero INSERTAR 2 filas en la tabla siguiente.
CREATE table table_z(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
val NUMBER,
hash_val VARCHAR2(1000) not NULL PRIMARY KEY,
clob_val CLOB);
davy.ai
Para comparar los dos CLOBs, crearía una nueva función que utilice la función
HASH_SHA512
previamente creada para generar un hash para cada CLOB, y luego compararía los valores de hash resultantes. Si los valores de hash coinciden, los CLOBs contienen valores idénticos, y si no coinciden, los CLOBs contienen valores diferentes. Aquí tienes un ejemplo de la función:Luego utilizaría esta función en una nueva consulta para generar la salida esperada mostrada en la pregunta:
Esta consulta compara los valores de los CLOBs en
CLOB1
yCLOB2
para cada fila y devuelve el resultado de la funciónCOMPARAR_CLOBS
comoCOMPARACION_CLOBS
. Con esta consulta se puede generar la salida esperada mostrada en la pregunta.Para insertar filas en
TABLA_Z
basándose en la comparación de los CLOBs, modificaría la consulta de la siguiente manera:Esta consulta inserta filas en
TABLA_Z
basándose en la comparación de los CLOBs enTABLA_X
. La primera instrucciónINSERT
inserta una única fila para cada par de CLOBs que son idénticos (COMPARAR_CLOBS
devuelve “IGUALES”). Las segunda y tercera instruccionesINSERT
insertan una fila para cada CLOB individual cuando son diferentes (COMPARAR_CLOBS
devuelve “DIFERENTES”). La columnaHASH_VALOR
enTABLA_Z
almacena el hash SHA512 del CLOB, y la columnaCLOB_VALOR
almacena el valor correspondiente del CLOB. Hay que tener en cuenta que esta consulta asume queHASH_SHA512
devuelve un valor de hash único para cada valor de CLOB distinto. Si este no es el caso, la columnaHASH_VALOR
deberá hacerse única utilizando una secuencia o algún otro mecanismo.