PDA

Ver la Versión Completa : Como convertir un campo VARCHAR a uno BLOB, si se puede?


judoboy
30-07-2003, 13:10:24
Pues eso como puedo hacer para cambiar todos los ficheros de un campo VARCHAR a uno BLOB.
O como convertir el campo VARCHAR en BLOB directamente.

kinobi
30-07-2003, 13:28:42
Hola,

en teoría debería ser algo así:


alter table "<tabla>"
alter "<columna_varchar>" type <blob> [subtype <subtipo>]


en la práctica no está soportado el cambio de tipo para los tipos de datos (como destino) BLOB y ARRAY; al menos hasta la versión 6.0.x de InterBase y 1.0.x de Firebird.

Puedes intentar "tocar" las tablas del sistema donde se almacena la información de tipo de las columnas. Concretamente la tabla RDB$FIELDS, columnas RDB$FIELD_TYPE, RDB$FIELD_SUB_TYPE. De todas formas, tampoco estoy seguro que puedas llegar a buen puerto.

Otra alternativa:
1. Crear la columna BLOB.
2. Mediante un UPDATE pasar el contenido de la columna VARCHAR a la columna BLOB recién creada.
3. Eliminar la columna VARCHAR.

Saludos.

judoboy
31-07-2003, 12:23:20
Habia pensado ya en crear un nuevo campo de tipo BLOB, y hacerlo mediante un UPDATE como bien dices, pero una cosa
como tengo que declarar el nuevo campo de tipo BLOB es decir eso del subtipo que decis, que no lo tengo claro. Porque yo creo el campo

ALTER TABLE FACTURAS ADD DESCRIPCION_CONCEPTO2 BLOB

Y claro luego al hacer el UPDATE que no se si lo hare bien, no me deja

UPDATE FACTURAS SET DESCRIPCION_CONCEPTO2=DESCRIPCION_CONCEPTO


Donde DESCRIPCION_CONCEPTO es el campo tipo VARCHAR

guillotmarc
31-07-2003, 14:11:38
Hola.

No puedes hacer ese UPDATE, porqué el motor no permite la conversión de tipos entre varchar y blob, con lo que los campos són de distinto tipo.

O bien te haces un pequeño programa Delphi, en que te coja un campo y lo asigne a otro, o tendrás que usar una UDF (hay algunas que llevan funciones de conversión de blob a varchar).

En la web de Claudio Valderrama tienes una lista bastante completa de udf's.

http://www.cvalde.com/

(Por cierto ahora no está en linea, supongo que será algo temporal, aquí tienes otra recopilación que no es tan completa http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_udf_libs)

Saludos.

kinobi
31-07-2003, 14:26:23
Hola,

Posteado originalmente por guillotmarc
No puedes hacer ese UPDATE, porqué el motor no permite la conversión de tipos entre varchar y blob, con lo que los campos són de distinto tipo.

pues yo estoy utlizando Firebird 1.0 y me permite hacer el UPDATE sin problemas ...

estos son los metadatos que estoy utlizando ...


CREATE TABLE "varchar2blob"
(
"campo1" VARCHAR(128),
"campo2" BLOB SUB_TYPE TEXT SEGMENT SIZE 80

);


y esta la setencia UPDATE para pasar los datos de "campo1" a "campo2":


update "varchar2blob"
set "campo2" = "campo1"
where "campo1" = "campo1"


A tener en cuenta que la cláusula WHERE de la sentencia UPDATE debería hacerse mejor con las claves primarias de la tabla.

Saludos.

guillotmarc
31-07-2003, 15:49:41
Hola

Tienes razón, lo acabo de probar, permite hacer directamente la asignación de campos.

Permite hacer cosas como :

set Campo_Blob = Campo_Varchar
set Campo_Blob = 'Texto'

pero no expresiones como :

set Campo_Blob = Campo_Blob || 'Texto'

judoboy tienes que usar el subtipo 1 (Texto). ¿ Que mensaje de error te da ? ¿ Que versión de Interbase/Firebird utilizas ?

Saludos.

judoboy
31-07-2003, 16:55:24
Vamos a ver por partes

Primero creo el nuevo campo de tipo BLOB de la siguiente forma:

alter table lineas_partida add descripcion_concepto2
blob sub_type text


no se si es así como tengo que crearlo.

2º Hago el UPDATE

var SentenciaSql:String;
begin
UModuloDAtos.Lin_Partidas.DAtaset.Open;
UModuloDatos.Lin_Partidas.DataSet.First;

while not (UModuloDatos.Lin_Partidas.DAtaSet.Eof) do
begin
SentenciaSql:='UPDATE LINEAS_PARTIDA SET DESCRIPCION_CONCEPTO2=
DESCRIPCION_CONCEPTO '+
' WHERE
PARTIDA="'+UModuloDatos.TLin_PartidasPARTIDA.AsString+'" ';
Q.Close;
Q.Sql.Clear;
Q.Sql.Add(SentenciaSql);
Q.ExecSQL;
UMOduloDatos.Lin_Partidas.DataSet.NExt;

end;

Partida es la clave primaria

Y me da el siguiente error

Invalid modify request.
conversion error from string "BLOB"

kinobi
31-07-2003, 17:02:43
Hola,

tal vez sea un problema del juego de caracteres (¿?), ya que el UPDATE que construyes, aparentemente debería funcionar; a mí desde luego me funciona.

De todas formas, ¿no sería más fácil hacerlo directamente con una herramienta tipo IBConsole, ISQL o similares, antes que hacerlo desde código Delphi?

Saludos.

guillotmarc
31-07-2003, 17:09:21
Hola.

A mi también me funciona. ¿ Que Interbase / Firebird usas ?, si usas una versión un poco antigua (IB 5, IB 6.0 OS, FB 1 RC1, ...) ¿ puedes actualizarte a Firebird 1.03 ?

Saludos.

judoboy
31-07-2003, 17:15:25
Utilizo Intebase 6.0

Si me actualizo a Firbird 1.3, no tendre nigún problema con mis BDA?

¿Me funcionarán todas las consultas que tengo creadas?

y lo más importante como hago la actualización?

kinobi
31-07-2003, 17:28:45
Hola,

Posteado originalmente por judoboy
Si me actualizo a Firbird 1.3, no tendre nigún problema con mis BDA?

probablemente no, pero es algo que no puede asegurarse al cien por cien.

Posteado originalmente por judoboy
¿Me funcionarán todas las consultas que tengo creadas?

en principio sí, pero como en el caso anterior, no es algo en lo que pueda darse una garantía total.

Posteado originalmente por judoboy
y lo más importante como hago la actualización?

1. Descargarse la versión binaria para tu sistema (Windows, Linux, ...). En la sección InterBase del Club, tienes las direcciones para las descargas.

2. Hacer un back-up previo (con InterBase 6.0) de todas las bases de datos que querrás utilizar con Firebird.

3. Desinstalar InterBase 6.0

4. Instalar Firebird

5. Recuperar (restore) los back-ups e las bases de datos que has hecho anteriormente.

Básicamente esos son los pasos.

En cuanto a usuarios creados en InterBase 6.0: en principio una copia directa de la base de datos de usuarios (isc4.gdb) que estabas utilizando en IB 6, debería funcionar en Firebird. Para más seguridad, puedes hacer el mismo proceso de back-up/restore que hagas con las bases de datos de los usuarios.

Saludos.