passar imagens no servidor para banco

Scripts Diversos para o Oracle SQL*Plus. (Relacionado a ferramenta Oracle SQL*Plus, para questões de SQL, usar o forum SQL)
Responder
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

Galera, sou iniciante em oracle, adorei o Forum, tirei muitas dúvidas nas pesquisas.
é a primeira vez que eu presciso da aguda de vocês,
é o seguinte:
tenho um montão de imagens em vários diretórios para passar para o banco, eu pesquisei aqui e vi algo que pode me ajudar, mais meus conhecimentos não são suficientes ainda.

o que eu achei foi o seguinte:
o Thomas F. G. colocou esse cod aqui

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> 
em: http://glufke.net/oracle/viewtopic.php?t=98

mais o que eu presciso é passar várias fotos dentro do diretório;
onde o id da tabela é o nome da imagem:
e fiz mais ou menos assim

Selecionar tudo

create or replace directory DIR_FIGURAS as 'c:\figura';
declare 
  l_blob blob; 
  l_bfile bfile; 
begin 
  insert into DEMO_FIGURAS values ( 2003400201002000006, empty_blob() ) 
  returning figura into l_blob; 
  l_bfile := bfilename( 'DIR_FIGURAS', '2003400201002000006.jpg' ); 
  dbms_lob.fileopen( l_bfile ); 
  dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) ); 
  dbms_lob.fileclose( l_bfile ); 
 end; 
em demo figuras, eu já tenho todos os nomes das figuras, então tem como eu fazer um select para pegar todos eles ?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

A ideia seria você fazer um cursor nos nomes dos arquivos e depois alterar onde ta fixo o nome do arquivo pegando o nome do arquivo atraves do cursor.
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

tentei isso mais não funcionou

Selecionar tudo

create or replace directory DIR_FIGURAS as 'c:\figura';
declare 
  l_blob blob; 
  l_bfile bfile;
begin 
 UPDATE SIGNATAL.DEMO_FIGURAS SET FIGURA=empty_blob() WHERE ID_FIGURA IN (SELECT declare nome_arquivo = CONCAT_STEPS(ID_FIGURA, '.jpg'), ID_FIGURA FROM SIGNATAL.DEMO_FIGURAS WHERE ID_FIGURA = 2003400201002000006)
  returning figura into l_blob; 
  l_bfile := bfilename( 'DIR_FIGURAS', nome_arquivo ); 
  dbms_lob.fileopen( l_bfile ); 
  dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) ); 
  dbms_lob.fileclose( l_bfile ); 
 end; 
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

Mais uma tentativa e o que falta é o ID_FIGURA que já esta na tabela mais não consigo pegar no select

Selecionar tudo

create or replace directory DIR_FIGURAS as 'c:\figura';
declare 
  l_blob blob; 
  l_bfile bfile;
begin 
  UPDATE SIGNATAL.DEMO_FIGURAS SET FIGURA=empty_blob() WHERE ID_FIGURA IN ( ID_FIGURA FROM SIGNATAL.DEMO_FIGURAS WHERE ID_FIGURA = 2003400201002000006)
  returning figura into l_blob; 
  l_bfile := bfilename( 'DIR_FIGURAS', [b] [color=red]ID_FIGURA[/color] [/b]); 
  dbms_lob.fileopen( l_bfile ); 
  dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) ); 
  dbms_lob.fileclose( l_bfile ); 
 end; 
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

veja como faz um cursor

vai ser algo mais ou menos assim cara:

Selecionar tudo

for i in (select nmarquivo from tabela) loop
  insert into SIGNATAL.DEMO_FIGURAS ...
  
  l_bfile := bfilename( 'DIR_FIGURAS', i.nmarquivo);
  dbms_lob.fileopen( l_bfile );
  dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) );
  dbms_lob.fileclose( l_bfile ); 

end loop;
estou meio apurado aqui cara, talvez alguém possa ajudar melhor..
desculpe, mas a idéia é essa..
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

Olha só fiz assim:

Selecionar tudo

create or replace directory DIR_FIGURA AS '/fotos/';

Grant all on directory DIR_FIGURA to USER;


declare

   l_blob blob; 
   l_bfile bfile;

 begin
 
 for i in ( SELECT CODIGO FROM IMAGES WHERE FOTO IS NULL and inscricao = 1000424003055000005 ) loop
    l_bfile  := bfilename( 'DIR_FIGURA', i.CODIGO || '.jpg' ); 
    
     if dbms_lob.FILEEXISTS( l_bfile ) = 1
     
      then
        BEGIN
         UPDATE IMAGES SET FOTO = empty_blob() where CODIGO = i.CODIGO 
         returning foto into l_blob;
         
         dbms_lob.fileopen( l_bfile, dbms_lob.file_readonly ); 
         dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) ); 
         dbms_lob.fileclose( l_bfile );
        END;
       commit;
      end if;
  
   end loop;
   
 end;
NO WINDOWS ESSE CODIGO FUNCIONOU MAIS NO LINUX DA ESSE BUG:

Selecionar tudo

Error report:
ORA-22288: falha no arquivo ou na operação LOBFILEOPEN
ORA-06512: em "SYS.DBMS_LOB", line 635
ORA-06512: em line 18
22288. 00000 -  "file or LOB operation %s failed\n%s"
*Cause:    The operation attempted on the file or LOB failed.
*Action:   See the next error message in the error stack for more detailed
           information.  Also, verify that the file or LOB exists and that
           the necessary privileges are set for the specified operation. If
           the error still persists, report the error to the DBA
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

o usuario oracle do linux tem permissão nesse diretorio /fotos ?

os valores do parametro UTL_FILE estão setados?
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

o usuario oracle do linux tem permissão nesse diretorio /fotos ?

resp tem!

inclusive ele passa por aqui:

if dbms_lob.FILEEXISTS( l_bfile ) = 1

quanto a UTL_FILE ?

eu terei que modifikar muita coisa...
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

qual o valor do parametro UTL_FILE?

select value from v$parameter where name like '%utl%'
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

(null )

(null)
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

eu já tinha usado directory pra não ter que reiniciar o computador...
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Reiniciar o computador = Reiniciar o banco?????

de qualquer forma, com directory ou caminho completo, UTL_FILE tem que estar definido para que o oracle permita a leitura/gravacao nesse diretorio em nivel de sistema operacional,

Realmente a alteracao desse parametro faz necessário restart do banco.
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

é isso... mais estou sem tempo prescisaria fazer isso até amanhan as 09:00 e estou sem raciocinio
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

você pode me da uma luz ?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

faz ai a mudanca do parametro UTL_FILE para o valor *

tem que criar um pfile, mudar o valor, e subir o banco com o pfile alterado, depois criar um spfile from pfile,


também estou meio apurado,

=/

tem varios documentos, coloca * no UTL_FILE primeiramente,
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

aí cara, faz aí:

select value from v$parameter where name = 'utl_file_dir'

veja se já possui algum diretorio, caso exista, inclua no comando abaixo,
exemplo: '/fotos','/home/oracle', caso tivesse retornado esse diretorio /home/oracle na consulta que eu passei,

alter system set utl_file_dir='/fotos' scope=spfile

depois:

shutdown immediate;

startup;

dai roda o select e veja se o valor foi alterado de acordo com o que queriamos com o alter system,
feito, em relacao ao parametro não tem mais erro,

aí veja se muda o erro,
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

retornou null
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

então é isso mesmo, não esta setado nada, faca o alter system, e restarta o banco, 99% que vai funcionar depois, =P
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

continuou null;

é assim mesmo ?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Qual a versão do seu banco?
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

11
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

11g
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

faz primeiro então:

create spfile from pfile;

shutdown immediate;

startup

alter system set utl_file...

shutdown immediate;

startup;
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

consegui não sempre fica null

doideira hem, ?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

e não retorna nenhuma mensagme ao executar os comandos???

faz também create pfile from spfile;

aí localiza o pfile no linux, normalmente fica dentro de $ORACLE_HOME/dbs, com nome initSID_DO_SEU_BANCO.ora

edita ele, coloca UTL_FILE_DIR=/fotos

salva o arquivo, baixa o banco,

faz startup pfile=caminho_do_seu_pfile/initSID_DO_SEU_BANCO.ora

após isso se não funcionar desisto,
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

não criou o diretorio
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

valeu mano pela ajuda...
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Cara, o banco não vai criar o diretorio.. o diretorio você tem que criar na mao, se você estava esperando que o oracle criasse ele no SO, não vai criar não..

=/
kastibergue
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Seg, 14 Dez 2009 8:56 am
Localização: Angicos - RN

:-o

Rsss

não eu digo que não existe o diretório

$ORACLE_HOME/dbs
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

uhmm, será que no 11 não tem?


faz aí echo $ORACLE_HOME, num terminal do linux,

deveria retornar o caminho da instalacao do oracle,
Responder
  • Informação
  • Quem está online

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