Pular para o conteúdo

Fóruns SQL e PL/SQL Erro PLS-00215 Responder a: Erro PLS-00215

#177899
Avatar photoJosé Laurindo Chiappa
Moderador

    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 ??