Incluir uma foto em um campo long raw

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Encontrei uma procedure na Internet para inserir uma foto em um campo long raw. Ela segue abaixo:

Selecionar tudo

create or replace
PROCEDURE INCLUI_foto IS
  V_IMAGE    LONG RAW;
  V_ARQUIVO  UTL_FILE.FILE_TYPE;
  BEGIN
    -- adiciona o imagen ao v_arquivo 
        V_ARQUIVO := UTL_FILE.FOPEN('dir1', 'FOTO1.JPG','r',32767);            
        
    -- adiciona do v_arquivo para o v_image 
    UTL_FILE.GET_RAW(V_ARQUIVO,V_IMAGE);
                   
        -- inserindo na tabela    
    INSERT INTO TESTE VALUES(1,V_IMAGE);
    COMMIT;
    DBMS_OUTPUT.PUT_LINE('Imagem inserida !') ;
  END;   


Mas toda vez que eu executo dá erro

Selecionar tudo

ORA-29280 ou ora-29283.
Criei 2 directórios: um apontando para uma pasta na minha máquina e um apontando para um diretório no nosso servidor.
Mas o erro continua.

Criei os diretórios da seguinte forma:

Selecionar tudo

create directory dir1 as 'd:\';
create directory dir2 as '/';
Criei os diretórios usando com o mesmo usuário dono da procedure.

Detalhe: não posso alterar o campo para blob como já vi na Internet.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Como está o parametro UTL_FILE_DIR???

Selecionar tudo

select value from v$parameter
where name = 'utl_file_dir'
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

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

se não estou enganado você só poderá escrever dentro desse diretorio,
tenta mudar seu directory para /tmp/dir2

e aí vai lá no linux e cria esse diretorio /tmp/dir2

deve funcionar...
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

O erro continua: ORA-29280

Selecionar tudo

CREATE OR REPLACE DIRECTORY DIR2 AS '/tmp/dir2';
execute inclui_foto;

Error report:

Selecionar tudo

ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 29
ORA-06512: at "SYS.UTL_FILE", line 448
ORA-06512: at "ADMSCV.INCLUI_FOTO", line 6
ORA-06512: at line 1
29280. 00000 -  "invalid directory path"
*Cause:    A corresponding directory object does not exist.
*Action:   Correct the directory object parameter, or create a corresponding
           directory object with the CREATE DIRECTORY command.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Está passando na procedure dir2 correto?

no linux tem permissao para owner da instalacao do oracle para este diretorio /tmp/dir2 ? ele existe?

o usuario (banco) owner, tem grant para read nesse directory?

Selecionar tudo

grant read on directory DIR2 to SEU_USUARIO;
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

1)Pelo exemplo que eu vi, estou passando o diretório corretamente para o UTL_FILE.FOPEN

2) O diretório existe e owner tem permissão neste diretório.

3) não havia dado o grant. Fiz isso, mas o erro continua.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Cara tenta assim:

Selecionar tudo

CREATE OR REPLACE DIRECTORY DIR2 AS '/tmp'; 
Se não funcionar não sei hein =/
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Já tentei assim também e não deu certo
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

-- adiciona o imagen ao v_arquivo

Selecionar tudo

V_ARQUIVO := UTL_FILE.FOPEN('dir1', 'FOTO1.JPG','r',32767);
coloca o nome do diretorio em maiusculo, num teste que eu fiz aqui isso fez diferença... dir1 > DIR1

=]
Robson Costa
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 155
Registrado em: Sex, 17 Out 2008 6:05 pm
Localização: Campo Grande - MS

Consegui rodar, substituindo onde estava o óbjeto diretório, colocar o diretório direto, ou seja:

Selecionar tudo

V_ARQUIVO := UTL_FILE.FOPEN('dir1', 'FOTO1.JPG','r',32767); 
coloquei:

Selecionar tudo

V_ARQUIVO := UTL_FILE.FOPEN('/tmp', 'FOTO1.JPG','r',32767); 
e deu certo.
Responder
  • Informação
  • Quem está online

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