Hoy me ha tocado modificar columnas en una tabla de las cuales las tengo en VARCHAR2 y las quiero pasar a CLOB, por ese motivo hago este post porque puede ser que a alguien también lo necesite.  Si alguien sabe un método mejor por favor que lo comparta!

Ante todo veamos estos dos tipos de datos. En Oracle, los tipos de datos VARCHAR2 y CLOB son diferentes en términos de su capacidad de almacenamiento y su forma de manipulación.

  • VARCHAR2 es un tipo de datos que se utiliza para almacenar cadenas de caracteres de longitud variable en la base de datos Oracle. La longitud máxima de un valor de VARCHAR2 en Oracle es de 4000 bytes. Si necesitamos almacenar una cadena de caracteres más larga, podemos utilizar el tipo de datos CLOB.
  • CLOB es un tipo de datos que se utiliza para almacenar grandes cantidades de datos de caracteres en la base de datos Oracle. Los valores CLOB pueden almacenar hasta 128 terabytes de datos. Los CLOB también pueden almacenar caracteres Unicode y permiten el uso de caracteres de varios bytes. La manipulación de CLOB se realiza mediante funciones especiales como DBMS_LOB que proporcionan una API para acceder a los datos de CLOB.

Veamos cuales son algunas de las diferencias adicionales entre VARCHAR2 y CLOB:

  1. Tamaño de almacenamiento: VARCHAR2 está limitado a 4000 bytes de almacenamiento, mientras que CLOB puede almacenar grandes cantidades de datos (hasta 128 terabytes).
  2. Manipulación de datos: los valores de VARCHAR2 se pueden manipular mediante operaciones de cadena de caracteres estándar como SUBSTR, INSTR y LENGTH, mientras que los CLOB requieren funciones especiales de manipulación de datos como DBMS_LOB.
  3. Índices: VARCHAR2 se puede indexar con índices estándar, mientras que los índices de CLOB se manejan de manera diferente y se utilizan índices especiales de texto completo.
  4. Rendimiento: VARCHAR2 es generalmente más rápido que CLOB, especialmente en operaciones que involucran búsquedas y comparaciones de cadenas de caracteres. Los CLOB requieren más recursos de almacenamiento y procesamiento.

El tipo de datos CLOB no es compatible con el VARCHAR2 es por eso que no podemos directamente hacer el cambio de tipo de datos pero además de ello tampoco podemos hacer el cambio de tipo de una columna de la tabla si esa columna tiene datos.

Para realizar esto, ante todo hacemos una copia de seguridad de la tabla con que vamos a trabajar :). No vaya a ser que…….

Estos son los pasos que he realizado para lograrlo:

  • He creado una nueva columna de tipo CLOB en la tabla
  • Luego he copiado los valores de la columna VARCHAR2 a la nueva columna CLOB y verifique que los datos sean correctos
  • Seguidamente elimine la columna VARCHAR2 original
  • Y finalmente he renombrado la nueva columna CLOB con el nombre de la columna VARCHAR2 original

Veamos un ejemplo de esta operación:

-- Agregar una nueva columna de tipo CLOB 
ALTER TABLE mi_tabla ADD mi_clob CLOB; 

-- Copiar los valores de la columna VARCHAR2 a la nueva columna 
CLOB UPDATE mi_tabla SET mi_clob = mi_varchar2; 

-- Eliminar la columna VARCHAR2 original 
ALTER TABLE mi_tabla DROP COLUMN mi_varchar2; 

-- Renombrar la nueva columna CLOB con el nombre de la columna VARCHAR2 original 
ALTER TABLE mi_tabla RENAME COLUMN mi_clob TO mi_varchar2;

Es importante tener en cuenta que este proceso puede ser lento y consumir muchos recursos si la tabla es grande. Además, es posible que la tabla deba estar inactiva durante el proceso de conversión, lo que puede afectar la disponibilidad del sistema. Por lo tanto, te recomiendo realizar este proceso cuidadosamente y en un ambiente de pruebas antes de aplicarlo en un entorno de producción.

Espero sea de utilidad

Actualización

¡Resulta y acontece que mi deseo de aprender cada día más, ha sido escuchado! Al publicar este post en Twitter mi amigo Javier Morales me comentó que hay una forma mucho mejor de realizar esta conversión y encima en caliente sin dejar latencias porque yo estoy en un momento eliminando la columna y renombrando, por eso quiero que veas este video donde él me cuenta una forma espectacular de realizar esta conversión de varchar2 a clob ¡que te vas a quedar con los ojos abiertos!