Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-07-2003
judoboy judoboy is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 139
Poder: 21
judoboy Va por buen camino
Como convertir un campo VARCHAR a uno BLOB, si se puede?

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.
Responder Con Cita
  #2  
Antiguo 30-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

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

Código:
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.
Responder Con Cita
  #3  
Antiguo 31-07-2003
judoboy judoboy is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 139
Poder: 21
judoboy Va por buen camino
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
Código:
 
ALTER TABLE FACTURAS ADD DESCRIPCION_CONCEPTO2 BLOB
Y claro luego al hacer el UPDATE que no se si lo hare bien, no me deja
Código:
UPDATE FACTURAS SET DESCRIPCION_CONCEPTO2=DESCRIPCION_CONCEPTO
Donde DESCRIPCION_CONCEPTO es el campo tipo VARCHAR
Responder Con Cita
  #4  
Antiguo 31-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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=...e=ibp_udf_libs)

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 31-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

Cita:
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 ...

Código:
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":

Código:
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.

Última edición por kinobi fecha: 31-07-2003 a las 14:32:45.
Responder Con Cita
  #6  
Antiguo 31-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 31-07-2003
judoboy judoboy is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 139
Poder: 21
judoboy Va por buen camino
Vamos a ver por partes

Primero creo el nuevo campo de tipo BLOB de la siguiente forma:
Código:
alter table lineas_partida add descripcion_concepto2
 blob sub_type text
no se si es así como tengo que crearlo.

2º Hago el UPDATE
Código:
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"
Responder Con Cita
  #8  
Antiguo 31-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 31-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #10  
Antiguo 31-07-2003
judoboy judoboy is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 139
Poder: 21
judoboy Va por buen camino
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?
Responder Con Cita
  #11  
Antiguo 31-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

Cita:
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.

Cita:
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.

Cita:
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:23:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi