gravar imagem jpg no banco tem como?

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

Amigo eu queria fazer um relacionamento dos produtos que eu tenho cadastrado junto com as fotos do mesmo. pra poderem serem enviandos por email. desde já eu te agradeço pela ajuda
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

inserindo imagens no oracle...
BLOB é o tipo recomendado. Não é difícil (e é claro, absolutamente TODOS os procedimentos que vou usar aqui estão DOCUMENTADOS nos manuais, no caso o manual "Oracle Application Developer's Guide - Large Objects (LOBs)".
Antes do exemplo, UM AVISO : o sql*plus é uma tool DE SERVIDOR, cujas linguagens internas (SQL, PL/SQL, Java com JVM Oracle interno) rodam apenas NO SERVIDOR, portanto com ela você conseguirá ler & gravar numa tabela apenas arquivos que :

a) estejam NO SERVIDOR, e

b) residam em diretório PERMITIDOS ao usuário que innstalou e possui o soft Oracle, e

c) tenham PERMISSÃO de leitura.

CASO você queira acessar arquivos que estejam numa máquina-cliente, via sqlplus NÂO conseguirá, aí OU você os transfere (via ftp, talvez) pro servidor OU usa uma tool/linguagem cliente (pode ser Forms, pro*C, Java, VB, Delphi, n outras). O exemplo via plus :

Selecionar tudo

serv:/home/oracle>ls -ltr *.jpg
-rw-r----- 1 oracle dba 262903 Jun 9 11:19 povo_do_live.jpg
serv:/home/oracle>

system:SQL>create table demo_figuras
2 ( id_figura number primary key,
3 figura blob
4 )
5 /

Tabela criada.

system:SQL>create or replace directory DIR_FIGURAS as '/home/oracle';

Diretório criado.

system:SQL>declare
2 l_blob blob;
3 l_bfile bfile;
4 begin
5 insert into demo_figuras values ( 1, empty_blob() )
6 returning figura into l_blob;
7 l_bfile := bfilename( 'DIR_FIGURAS', 'povo_do_live.jpg' );
8 dbms_lob.fileopen( l_bfile );
9 dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) );
10 dbms_lob.fileclose( l_bfile );
11 end;
12 /

Procedimento PL/SQL concluído com sucesso.

system:SQL>select id_figura, dbms_lob.getlength(figura) BYTES_GRAVADOS 
2 from demo_figuras;

ID_FIGURA BYTES_GRAVADOS
---------- --------------
1 262903

system:SQL>
você falou de relacionamento.. pode ser um campo na tabela de produtos..
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

valeu amigo eu vou estudar essa dica
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

amigo ,esta dando error na hora d passar os parametros para a procedure que eu crie

Selecionar tudo

create or replace procedure Pr_Carregar_imagem(p_arquivo in varchar2, pcd_produto_ in varchar2, p_tipo in varchar2) is
   MeuBlob Blob;
   MeuArq  BFile;
begin
  if p_Tipo = 'I' then --imagens armazenadas no banco
     insert into TT_IAMGENS_PRODUTOS(cd_produto, IMAGEM_DESC_PROD, tipo)
        values (pcd_produto_, empty_blob(), p_Tipo)
        returning IMAGEM_DESC_PROD into MeuBlob;

     MeuArq := bfilename('DIR_IMAGENS_PROD',p_arquivo);
     DBMS_LOB.fileopen(MeuArq);
  ---------------   DBMS_LOB.loadfromfile(dest_lob, MeuBlob, src_lob , MeuArq, amount, DBMS_LOB.getlength(MeuArq));
     dbms_lob.loadfromfile( MeuBlob, MeuArq, dbms_lob.getlength( MeuArq) ); 
     DBMS_LOB.fileclose(MeuArq);
         
  elsif p_Tipo = 'E' then --imagens externas
     insert into TT_IAMGENS_PRODUTOS(cd_produto, IMAGEM_EXT, tipo)
            values (pcd_produto_, bfilename('DIR_IMAGENS_PROD',p_arquivo), p_tipo);
              
   end if;
  
 commit work;
    
end Pr_Carregar_imagem;
/
o erro ORA-01003 no statement pased
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

ORA-01003:	no statement parsed
Cause:	A host language program call referenced a cursor with no associated parsed SQL statement. A SQL call (for example, OSQL3) must be used to pass a SQL statement to Oracle and to associate the statement with an open cursor. A cursor must already have an associated SQL statement if referenced in any of the following calls: DESCRIBE, NAME, DEFINE, BIND, EXECUTE, and FETCH.
Action:	Do the SQL call, for example, OSQL, to pass the required SQL statement before referencing the cursor.

então brother...

pelo que entendi o erro está em um cursor do seu programa que chama esta procedure e não nessa procedure que você postou ai..

você debugou seu programa? cade a rotina que chama essa sua procedure?
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

amigo eu fiz assim a chamada da procedure

Selecionar tudo

StpPrcarregaImg.Prepare;
      StpPrcarregaImg.ParamByName('P_ARQUIVO').AsString:=Trim(EditArquivo.Text);
      StpPrcarregaImg.ParamByName('PCD_PRODUTO_').AsString:=Trim(EditProduto.Text);
      StpPrcarregaImg.ParamByName('P_TIPO').AsString:=Trim(EditTipo.Text);
      StpPrcarregaImg.ExecProc;
      StpPrcarregaImg.UnPrepare;
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

Hugo, eu conseguir inserir direto no sql plus, eu fiz assim

Selecionar tudo

insert into TT_IAMGENS_PRODUTOS(cd_produto,IMAGEM_EXT, tipo)
            values ('35905005',bfilename('DIR_IMAGENS_PROD','Arroz Koblenz.jpg'), 'E');
agora ,como você disse pra mim poder visualizar no meu form essa foto , como e que eu poderia mesmo. eu uso o delphi 2006
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

bom... você quer saber como exibir em um form a imagem que recuperou do banco, e isso em delphi?

acho q vai te ajudar..
http://www.delphi-central.com/BitmapShapedForm.aspx

http://en.allexperts.com/q/Delphi-1595/ ... ages.htm#b

http://www.mail-archive.com/delphi-br@y ... 66276.html
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

Amigo eu me enganei , eu pensei que o insert ai de cima , estava incluindo as fotos, eu verifiquei com a dica que você me passou e esta dando o erro
ora-222888 , você tamebm poderia me informa como eu crio diretorio direto no servidor?
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

esqueci de avisar que a forma que eu fiz ele só inclui o codigo do produto
wilke
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Sex, 23 Nov 2007 9:26 am
Localização: porto velho -ro

Hugo eu fiz aqui e deu certo agora está inserindo no banco
eu fiz assim

Selecionar tudo

 mkdir /oracle/dbs/imagem
 create or replace directory DIR_IMAGENS_PROD as '/oracle/dbs/imagem';
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

que bom brother

parabens!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes