Cambiar tipo de dato de LONG RAW a CLOB

Soy nuevo en oracle:
Se me presento un problema con el tipo de datos long raw, tengo una columna que es sol_dictado que es de tipo long raw y cuando quiero guardar un texto que es muy grande me sale el sgt error:
ORA-01461: can bind a LONG value only for insert into a LONG column
Creo que el texto es muy grande y no lo puede guardar, no se cuanto puede guardar ese tipo de dato, ni se si puedo aumentar el tamaño, pero el tipo de dato CLOB soporta una gran cantidad de texto pero no puedo cambiarlo.

4 respuestas

Respuesta
1
El campo LONG RAW almacena hasta un maximo de 2 GB, si dices que estas guardando un archivo texto me imagino que debe ser muy grande o podria haber un problema en tu aplicativo, muchas veces se da el problema cuando se insertan o actualizan valores en la base de datos desde alguna aplicación cliente, como por ejemplo Forms o Java y la definicion del set de caracteres es distinto entre el servidor y el cliente. Se me dio un caso utilizando Forms 10g, intentaba grabar en un textbox dos mil y tantos caracteres en un formulario, obteniendo repetidamente el error. El campo de formulario estaba definido como CHAR de largo máximo 4000 y la columna de la base de datos era VARCHAR2 de 4000; ¿Entonces dónde estaba el problema?
El problema resultó en el character set de la base de datos y el character set del cliente.
La base de datos tenía un character set multibyte, es decir que puede utilizar varios bytes para representar un caracter. El cliente (en mi caso Application Server 10g), estaba configurado con un character set single byte. Resultado: el cliente enviaba 1 byte y la base de datos almacenaba en 3 bytes. Al enviar más de la tercera parte del tamaño de la columna, se produce un bug (conocido) de Oracle en el cual supone que se le está enviando un LONG. Forms internamente utiliza bind variables para las operaciones en formularios, por lo tanto se produce el error: can bind a LONG value only for insert into a LONG column.
La solución simple es modificar el character set del cliente, en este caso del Application Server. Particularmete elegí el mismo que tenía la base de datos (UTF8).
Los datos quedan intactos, y el cambio en mi cliente es transparente. Ahora cliente y servidor tienen los mismos juegos de caracteres, y evita que se produzcan las conversiones que llevan al bug mencionado.
Para conocer el character set de la base de datos, puede ejecutarse esta consulta desde SQL*Plus:
SELECT VALUE FROM v$nls_parameters WHERE PARAMETER = 'NLS_CHARACTERSET';
Si definitivamente deseas cambiar el tipo de campo te comento que el CLOB no es un tipo básico y se comporta como un objeto, con lo que para acceder a él se tienen que utilizar las funciones especificadas en DBMS_LOB, lo cual te implicaria cambiar tu aplicativo.
Te recomiendo revisar antes tu aplicativo y talves sea algun error de programacion y si aun asi deseas hacer la conversión te podria seguir ayudadndo.
Exitos
Gracias por tu rapida respuesta,  en mi caso  trabajo con un aplicativo en power builder, donde se registra los dictados  de asesoria,  lo que realiza la secretaria  es ingresar todo el dicta del abogado que esta en word lo copia y lo pega en el aplicativo.. pero no se como ver que  cual es el character set del cliente, donde puedo ir para ver eso...
 la base de datos es 10g.
Te soy sincero y no he trabajado con power builder, pero puedes setear el cliente enviando un ALTER SESSION SET NLS_CHARACTERSET=WE8ISO8859P1; por ejemplo, como cualquier consulta que ejecutas desde el aplicativo, de esa forma te aseguras que tenga el mismo seteo, eso lo puedes hacer despues del login.
Exitos.
Respuesta
1
El tipo de datos Long raw puede almacenar hasta 2 Gb. El tipo CLOB hasta 4 Gb.
¿Estas seguro que el tamaño supera el limite? Puede que el problema sea que character set de la base de datos y el character set del cliente son distintos.
La base de datos tenía un character set multibyte, es decir que puede utilizar varios bytes para representar un carácter. El cliente (en mi caso Application Server 10g), estaba configurado con un character set single byte. Resultado: el cliente enviaba 1 byte y la base de datos almacenaba en 3 bytes. Al enviar más de la tercera parte del tamaño de la columna, se produce un bug (conocido) de Oracle en el cual supone que se le está enviando un LONG. Forms internamente utiliza bind variables para las operaciones en formularios, por lo tanto se produce el error.
La solución simple es modificar el character set del cliente, en este caso del Application Server. Particularmete elegí el mismo que tenía la base de datos (UTF8).
Los datos quedan intactos, y el cambio en mi cliente es transparente. Ahora cliente y servidor tienen los mismos juegos de caracteres, y evita que se produzcan las conversiones que llevan al bug mencionado.
Para conocer el character set de la base de datos, puede ejecutarse esta consulta desde SQL*Plus:
SELECT VALUE FROM v$nls_parameters WHERE PARAMETER = 'NLS_CHARACTERSET';
Si ese no fuera el problema para cambiar el tipo de un campo no lo puedes hacer directamente. Tienes que crear otro campo (Clob), copiar los valores del campo LOW RAW al CLOB y después borrar el LOW RAW. Para todo esto debes hacer un PL en que que vayas utilizando la funciones de inserción en campos CLOB. Aunque más sencillo a mi modo de ver es crear una tabla utilizando la funcionalidad to_lob (no se puede hacer directamente)
Ejemplo:
//Tabla inicial (supuestamente ya creada)
reate table tabla
( campo long raw);
alter table tabla ADD campoB clob; -->
insert into tabla values('1',empty_clob());
//Esto NO FUNCIONA --> UPDATE tabla SET campoB =to_lob(campo);
//¿Creo la tabla de apoyo (tabla 2) haciendo la transformación?
Create table tabla2 as
(Select to_lob(campo) campo, campoB, from tabla)
Ya tengo todo los datos en una tabla (tabla2) con el campo clob
Respuesta
1
Lo que intentas hacer no lo permite oracle de forma directa pues son dos tipos de datos muy diferentes
intenta esto:
Adicionale a la tabla un campo nuevo de tipo clbob
luego le das la siguiente instruccion en pl/sql o sqlnavigator o lo que uses para editar sql
update tablaxxxx set camponuevo_clob=to_clob(campo_viejo)
despues que te haya funcionado verificas que la informacion si haya pasado
y luego borras el campo viejo
alter table tablaxxx drop column nombredecampoviejo;
y por ultimo renombras el camponuevo con el nombre del campo viejo
alter table tablaxxxx rename column columnanueva TO nombrecampoviejo;
Gracias por tu respuesta y discúlpame la demora en responder, realice todo los pasos como indicas, pero obtengo un error al momento de ejecutar la sentencia, el erro es:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG BINARY
  Dime que otra solución puede haber
No me dices en cual de todas las instrucciones es donde te sale el error, si euieres enviame la estructura de la tabla y lo que escribiste para que miremos
Respuesta
-1
Ese error no creo que sea debido al tamaño, sino al modo que intnetas insertarlo. Dime como intentas insertar dicho campo. ¿Estás usando PL SQL? ¿Java?
Lo quiero insertar a través de un aplicativo en power builder que utiliza un datawindows... es un simple update... pero lo puedo guardar si saco 10 lineas de todo el texto si lo puedo guardar...
Tienes razón, AL parecer no está permitido almacenar más de 4000 caracteres en un campo tipo long raw.
Por lo tanto si quieres almacenar más te recomiendo migres el campo a clob, o crees un campo CLOB para textos más grandes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas