Hola,
El tema de los 3999 caracteres viene de la conversion implicita de VARCHAR2 a CLOB, me explico.
Cuando realizas un insert con SQL, como por ejemplo
Código:
SQL> desc t1
Nombre ┐Nulo? Tipo
----------------------------------------- -------- --------------------
ID NUMBER
DATA CLOB
SQL> insert into t1 values (1,'Este string es un tipo varchar');
1 fila creada.
SQL> commit;
Confirmaci¾n terminada.
SQL>
En la cadena del insert no puedes superar los 4k (4000 caracteres) dado que Oracle lo interpreta como VARCHAR2 al momento de hacer el parseo de la sentencia SQL y lo convierte a CLOB al momento de hacer el insert.
Si necesitas hacer insert con SQL o PL/SQL debes utilizar el paquete DBMS_LOB, que es la API que provee Oracle para el manejo de LOBs, si el insert lo haces a traves de algun provider, JDBC me imagino, tienes que leer sobre el soporte JDBC para LOBs.
Pd,
Cita: campos que por lo que entiendo no tienen restricciones de tamaño
Si tienen, 4G y se almacenan en un segmento diferente a la tabla, como dato curioso te comento que, si el valor del campo LOB en una fila determinada tiene menos de 4K, Oracle lo almacena en el mismo segmento que la tabla para poder acceder mas rapido.
Este comportamiento se puede cambiar con el parametro DISABLE_STORAGE_IN_ROW de los segmentos LOBs.
Saludos