tipos ora obtenido manejo long leer inconsistentes exportar example esperaba datos dato convertir sql triggers db2 compare clob

ora - SQL-¿Cómo se compara un CLOB



manejo de clob en oracle (9)

Calcule el hash md5 (u otro) de los clobs y luego compare estos. El cálculo inicial será lento, pero la comparación es rápida y fácil. Este podría ser un buen método si la mayor parte de sus datos no cambia con mucha frecuencia.

Una forma de calcular md5 es a través de una declaración java en su desencadenante. Guárdelos en la misma tabla (si es posible) o cree una tabla auxiliar simple.

en un activador de DB2, necesito comparar el valor de un campo CLOB. Algo como:

IF OLD_ROW.CLOB_FIELD != UPDATED_ROW.CLOB_FIELD

pero "! =" no funciona para comparar CLOB.

¿Cuál es la forma de compararlo?

Editado para agregar:

Mi disparador necesita hacer algo si el campo Clob fue cambiado durante una actualización. Esta es la razón por la que necesito comparar los 2 CLOB en el código de activación. Estoy buscando información detallada sobre cómo se puede hacer esto


Creo que no es posible utilizar este tipo de operadores en los campos CLOB, debido a la forma en que están almacenados.


La idea de Iglekott es buena, con una advertencia:

Tenga cuidado con compare-by-hash si es probable que sus datos sean atacados. Actualmente, no es factible computacionalmente generar una colisión hash para un valor MD5 específico, pero es posible generar dos entradas diferentes que producirán el mismo MD5 (por lo tanto, no se activará el código). También es posible generar dos cadenas diferentes con el mismo prefijo que hash para el mismo valor.

Si ese tipo de ataque puede comprometer la integridad de su sistema, y ​​eso es una preocupación, desea explorar otras opciones. Lo más fácil sería simplemente cambiar las funciones hash, SHA-2 no tiene vulnerabilidades actualmente conocidas.

Si esto no es una preocupación, diablos, ve con CRC. No vas a buscar seguridad criptográfica aquí. Simplemente no vayas con una función criptográficamente débil si estas cosas se están instalando en una smartbomb, ''mkay? :-)


¿Utiliza DB2 != Para no iguales? El estándar ANSI SQL usa <> para no iguales.


En Oracle 10g puedes usar DBMS_LOB.compare () API.

Ejemplo:

select * from table t where dbms_lob.compare(t.clob1, t.clob2) != 0

API completa:

DBMS_LOB.COMPARE ( lob_1 IN BLOB, lob_2 IN BLOB, amount IN INTEGER := 4294967295, offset_1 IN INTEGER := 1, offset_2 IN INTEGER := 1) RETURN INTEGER; DBMS_LOB.COMPARE ( lob_1 IN CLOB CHARACTER SET ANY_CS, lob_2 IN CLOB CHARACTER SET lob_1%CHARSET, amount IN INTEGER := 4294967295, offset_1 IN INTEGER := 1, offset_2 IN INTEGER := 1) RETURN INTEGER; DBMS_LOB.COMPARE ( lob_1 IN BFILE, lob_2 IN BFILE, amount IN INTEGER, offset_1 IN INTEGER := 1, offset_2 IN INTEGER := 1) RETURN INTEGER;


La idea md5 es probablemente la mejor, pero otra alternativa es crear un activador especial que solo se active cuando se actualice su campo CLOB.

Según el diagrama de sintaxis , debe definir el desencadenador como:

CREATE TRIGGER trig_name AFTER UPDATE OF CLOB_FIELD //trigger body goes here

Esto supone que su aplicación (o quien esté actualizando la tabla) es lo suficientemente inteligente como para actualizar el campo CLOB SÓLO CUANDO se ha realizado un cambio en el campo clob, y no cada vez que se actualiza su tabla.


Si los CLOB son de 32K o menos, puede convertirlos como VARCHAR, lo que permite la comparación, LIKE y varias funciones de cadena SQL.

De lo contrario, es posible que desee considerar agregar una columna para contener el hash del CLOB y cambiar la (s) aplicación (es) para mantener ese hash actualizado cada vez que se actualiza el CLOB.


Simplemente declare el disparador para disparar si esa columna en particular se actualiza.

create trigger T_TRIG on T before update of CLOB_COL ...


Generar un valor hash y compararlos es la mejor manera en mi humilde opinión.

Aquí está el código no probado:

... declare leftClobHash integer; declare rightClobHash integer; set leftClobHash = ( SELECT DBMS_UTILITY.GET_HASH_VALUE(OLD_ROW.CLOB_FIELD,100,1024) AS HASH_VALUE FROM SYSIBM.SYSDUMMY1); set rightClobHash = ( SELECT DBMS_UTILITY.GET_HASH_VALUE(UPDATED_ROW.CLOB_FIELD,100,1024) AS HASH_VALUE FROM SYSIBM.SYSDUMMY1); IF leftClobHash != rightClobHash ...

Tenga en cuenta que necesita el privilegio EXECUTE en el módulo DBMS_UTILITY. Puede encontrar más información sobre el código SQL PL proporcionado en los siguientes enlaces.