Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-11-2006
jr_ewing jr_ewing is offline
Registrado
 
Registrado: sep 2006
Posts: 5
Poder: 0
jr_ewing Va por buen camino
Unhappy Grabación de imágenes en Oracle 9i a través de SP

Hola a todos,

Estoy intentando grabar imágenes en una columna BLOB de una tabla de Oracle 9i con Delpih IV. Dado que el usuario de conexión a la aplicación, por razones de seguridad, lo único que tiene son sinónimos a Stored Procedures de otro schema con grants de execute (el usuario de conexión no vé las tablas), la única forma de efectuar la grabación es pasando el valor a un Stored Procedure.

Estoy utilizando ODAC en Delphi, tengo un componente TOraQuery (similar al TQuery+TUpdateSql) con una columna IMAGEN tipo Blob. El código para SQLInsert del componente es algo así:

Código SQL [-]
begin
INS_REGISTRO(:CODIGO, :IMAGEN);
end;

La parte de captura de datos en Delphi la resuelvo utilizando un componente TDBImage, y con este código:

Código Delphi [-]
procedure TForm1.DBImage1DblClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then OpenFile(OpenPictureDialog1.FileName)
end;
 
procedure TForm1.OpenFile(const Filename: string);
begin
try
DBImage1.Picture.LoadFromFile(Filename);
except
on EInvalidGraphic do
DBImage1.Picture.Graphic := nil;
end;
end;

Esto funciona bien, me lee cualquier tipo de imagen (jpg, bmp, o ico).

El problema lo tengo en Oracle. Según lo que leí en la documentación, debería resolverlo así (asumiendo que las imágenes a cargar sean chicas, nunca superiores a 32K):

Código SQL [-]
PROCEDURE INS_REGISTRO
 (vCodigo in varchar2, 
  blImagen in blob) IS 
blAux   blob; 
rwAux   raw(32767);
BEGIN
 insert into TABLA
  (codigo, imagen)
 values 
  (vCodigo, empty_blob())
 return 
  imagen into blAux;
 nLong:=32767;
 dbms_lob.read(blImagen,nLong,1,rwAux);
 dbms_lob.writeappend(blAux,32767,blImagen);
 commit; 
END;

Al ejecutar el SP Oracle me devuelve el sgte error:
ORA-06502: PL/SQL: numeric or value error: invalid LOB locator specified: ORA-22275

¿Alguien sabe en qué me estoy equivocando? O lo que es peor: lo que quiero hacer...¿se puede hacer?

Gracias.
Responder Con Cita
  #2  
Antiguo 03-11-2006
jr_ewing jr_ewing is offline
Registrado
 
Registrado: sep 2006
Posts: 5
Poder: 0
jr_ewing Va por buen camino
Fe de erratas

En el último código SQL, donde dice:
Código SQL [-]
   dbms_lob.writeappend(blAux,32767,blImagen);
debió decir:
Código SQL [-]
   dbms_lob.writeappend(blAux,32767,rwAux);
De todas maneras, el error sigue siendo el mismo, y ahora descubrí que se genera al ejecutar el sgte comando:
Código SQL [-]
size="1">   dbms_lobsize="1">.size="2">read(blImagen,nLong,1,rwAuxsize="1">size="2">);
Lo que más me llama la atención es que si ejecuto:
Código SQL [-]
size="1">size="1">  nLong:=dbms_lob.getlength(blImagen);
nLong me da null (por eso me preguntaba si lo que quiero hacer se puede hacer...)
Responder Con Cita
  #3  
Antiguo 03-11-2006
jr_ewing jr_ewing is offline
Registrado
 
Registrado: sep 2006
Posts: 5
Poder: 0
jr_ewing Va por buen camino
Ay...

Bueno, perdonen ahora que me salieron todos esos size en el código SQL... Recién estoy aprendiendo a usar esto...
Responder Con Cita
  #4  
Antiguo 02-02-2007
Avatar de maco
maco maco is offline
Registrado
 
Registrado: dic 2005
Posts: 1
Poder: 0
maco Va por buen camino
Cualquier tipo de archivo en DB de Oracle

Con este codigo en un TOraQuery puedes subir a la DB cualquier tipo de archivo

OraQuery1.Close;
OraQuery1.UnPrepare;
OraQuery1.SQL.Clear;
OraQuery1.SQL.Text:=
'insert into TABLA'+
' (codigo, imagen)'+
'values'+
' (:vCodigo, empty_blob())'+
'return'+
' imagen into :imagen';
OraQuery1.Prepare;
OraQuery1.ParamByName('vCodigo').Value:= Codigo;
OraQuery1.ParamByName('imagen').LoadFromFile(OpenPictureDialog1.FileName ,ftOraBlob);
OraQuery1.ParamByName('imagen').ParamType:= ptInput;
OraQuery1.ExecSQL;
OraQuery1.Close;
OraQuery1.UnPrepare;

y para bajarlo lo haces con un quiery en un TOraQuery

OraQuery1.Close;
OraQuery1.UnPrepare;
OraQuery1.SQL.Clear;
OraQuery1.SQL.Text:=
'select *'+
'from TABLA' // + condicion where si la necesitas
OraQuery1.Prepare;
OraQuery1.Open;
TBlobField(Query1.FieldByName('imagen')).SaveToFile(SaveDialog1.FileName);
OraQuery1.Close;
OraQuery1.UnPrepare;
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar imagenes en Oracle 8i con BDE 5.0 vmladino Oracle 1 31-10-2007 23:24:43
grabación jorodgar Windows 4 19-09-2005 11:22:42
Recuperando imagenes desde Oracle MarioATamborini Oracle 4 14-07-2005 21:52:14
Imagenes en Oracle 7 jnbruguer Oracle 6 07-07-2005 19:16:07
Recuperando imagenes desde Oracle vmladino Gráficos 1 11-11-2004 17:23:35


La franja horaria es GMT +2. Ahora son las 13:34:20.


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