2008-04-30

Inserir ficheiros na BD

Recebi este pedido de ajuda via email na última semana que penso ser util expôr aqui:


O meu problema é o seguinte:

Estou a tentar criar um procedimento para inserir ficheiros na base de dados mas não se tem demonstrado fácil…

Criei vários procedimentos semelhantes, mas obtenho sempre o mesmo erro. Um dos procedimentos é o seguinte:

PROCEDURE INSERT_ARQ_LOB ( Diretorio varchar2, arquivo varchar2) is

doc blob;
V_ARQUIVO bfile;
V_CAMPO_LOB blob;
V_TAM_ARQUIVO integer;
begin
V_ARQUIVO:=bfilename(Diretorio,Arquivo);
dbms_lob.fileopen ( V_ARQUIVO, dbms_lob.file_readonly );
V_TAM_ARQUIVO:=dbms_lob.getlength(V_ARQUIVO);
insert into teste_blob(id,nome,ficheiro) values (1,arquivo,empty_blob())
returning ficheiro into V_CAMPO_LOB;
dbms_lob.loadfromfile(V_CAMPO_LOB,V_ARQUIVO,V_TAM_ARQUIVO);
dbms_lob.fileclose(V_ARQUIVO);

commit;
end;


Quando lhe passo um caminho da minha máquina,

begin
INSERT_ARQ_LOB('C:\Documents and Settings\fpires\Ambiente de trabalho\CCP','concurso_publico.pdf');
end;

obtenho o seguinte erro:

11:29:01 ORA-00604: error occurred at recursive SQL level 1
11:29:01 ORA-01460: unimplemented or unreasonable conversion requested
11:29:01 ORA-06512: at "SYS.DBMS_LOB", line 504
11:29:01 ORA-06512: at "PK2000.INSERT_ARQ_LOB", line 9
11:29:01 ORA-06512: at line 2

Se lhe passar um caminho que eu defeni em dba_directories no servidor, obtenho este erro:

11:30:22 ORA-22285: non-existent directory or file for FILEOPEN operation
11:30:22 ORA-06512: at "SYS.DBMS_LOB", line 504
11:30:22 ORA-06512: at "PK2000.INSERT_ARQ_LOB", line 9
11:30:22 ORA-06512: at line 2

Eu confirmei que os ficheiros existem nas directorias mas não estou a ver qual será o problema…
Será que me podes ajudar?


A minha resposta:

Necessitas de 1º criar um objecto directory
CREATE DIRECTORY Diretorio AS '/bla/bla';
E usas esse objecto no V_ARQUIVO:=bfilename(Diretorio,Arquivo);
As directorias são no servidor e necessitas de ter permissão de “create directory”



Outra questão se seguiu:

Não é possível carregar o ficheiro directamente da máquina do cliente certo? Então terei que o enviar temporariamente para a directoria definida na tabela dba_directories para depois ser guardado na BD correcto? Qual será a melhor forma de fazer isto?


A minha resposta:

No meu ambiente usamos o Oracle WebServer e programaticamente torna-se possível (via formulário Web) colocar ficheiros na BD
(usando PL/SQL).

Também é possível via programação de uma aplicação cliente em java, .net por exemplo (usando ODBC,…).
Tb é possível usado o MS Access.


No caso de usares Oracle Forms tens de usar o “add–on” Webutil.
Este deve ser instalado no servidor e vai fazer com que o cliente faça load de classes java e disponibiliza varia funções/procedimentos nos forms em PL/SQL.
Entre as carateristicas principais saliento a interação com o cliente (ler/escrever ficheiros na maquina cliente) e interacção com OLE2 (produção de documentos em Word/Excel)

No comments:

Post a Comment

Os comentários são moderados.
The comments are moderated.