Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como convertir un campo VARCHAR a uno BLOB, si se puede? (https://www.clubdelphi.com/foros/showthread.php?t=2600)

judoboy 30-07-2003 13:10:24

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.

kinobi 30-07-2003 13:28:42

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.

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
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

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=...e=ibp_udf_libs)

Saludos.

kinobi 31-07-2003 14:26:23

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.

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:
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"

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,

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.


La franja horaria es GMT +2. Ahora son las 21:21:39.

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