› Fóruns › SQL e PL/SQL › Erro PLS-00215 › Responder a: Erro PLS-00215
Só alguns reparos e observações no seu código, talvez te sejam úteis :
1) a variável BFILe vai conter um pointer PARA O ARQUIVO, e NÃO PARA A PASTA, então sugiro não a chamar de PASTA : não pega nada mas isso “soa” mal, é uma complicação extra e indicação de conceito não compreendido
2) o LOADxxxFROMFILE até onde sei NÂO FAZ COMMIT automaticamente, então o COMMIT *** TEM *** que ficar no FIM do código, que aí ele comita tanto o INSERT quanto o LOAD na coluna CLOB
3) tem um bug BEM RUIM no seu código – na chamada à LOAD, vc escreveu :
dbms_lob.loadclobfromfile(l_clob, l_bfile,vTamanho_Texto,v_dest_offset,v_dest_offset,……
Ou seja, PARA DOIS ARGUMENTOS DIFERENTES vc está passando A MESMA VARIÁVEL !!!!!! NÃO FAÇA ISSO, Please, Só PODE dar ruim……
4) NEM TODAS as variáveis citadas / passadas como argumentos na chamado ao LOAD FORAM declaradas no DECLARE : por exemplo, não vi a l_bfile_csid …. Isso é BÁSICO na programação PL/SQL, absolutamente TODAS as variáveis TEM que ser declaradas….
5) veja no meu código que estou passando os argumentos TODOS para a função via => , que é a maneira de não ser Obrigado a seguir a sequência / relação completa de argumentos : SE vc seguir a sequência/lista de argumentos todinha tudo bem, dá certo não usar => , mas Eu Prefiro não arriscar…
Ficaria assim mais ou menos o código corrigido :
DECLARE
l_clob clob;
v_src_offset number:=1;
v_dest_offset number:=1;
l_lang_context number := dbms_lob.default_lang_ctx;
l_warning number;
vTamanho_Texto number;
l_bfile bfile;
l_bfile_csid number := 0;
BEGIN
l_bfile:=bfilename('TESTETD','teste.txt');
vTamanho_Texto:=dbms_lob.getlength(l_bfile);
dbms_lob.fileopen(l_bfile,dbms_lob.lob_readonly);
vTamanho_Texto:=dbms_lob.getlength(l_bfile);
insert into testeclobxml1(ID, NOME, ARQUIVO) VALUES(2,'teste',EMPTY_CLOB()) returning arquivo into l_clob;
--
dbms_lob.loadclobfromfile (
dest_lob => l_clob,
src_bfile => l_bfile,
amount => vTamanho_Texto,
dest_offset => v_dest_offset,
src_offset => v_src_offset,
bfile_csid => l_bfile_csid ,
lang_context=> l_lang_context,
warning => l_warning
);
--
dbms_output.put_line('Tamanho do arquivo é:'||dbms_lob.getlength( l_bfile ));
dbms_output.put_line('Bytes lidos e gravados=' ||dbms_lob.getlength(l_clob));
dbms_lob.fileclose(l_bfile);
commit;
END;
**** DEPOIS **** que vc Realmente tiver checado permissões DENTRO e (PRINCIPALMENTE!!) FORA DO BANCO (ie, na pasta E no arquivo, direto no Windows), rodando esse código corrigido TEM que funcionar, ok ??