Pular para o conteúdo

Fóruns SQL e PL/SQL Duvida – String com caracteres Duvida – String com caracteres

#99264
rman
Participante

    Doug, o erro não está o no put.

    Fiz alguns testes, e dei umas pesquisadas, porque de inicio não fazia sentido dar erro.


    UTL_FILE.FOPEN (
    location IN VARCHAR2,
    filename IN VARCHAR2,
    open_mode IN VARCHAR2,
    max_linesize IN BINARY_INTEGER)
    RETURN file_type;

    max_linesize é o tamanho maximo de cada linha, incluindo o caracter de nova linha, logo temos 32767 bytes, que é igual a 31k menos 1b, max_linesize pode ir de 1 a 32767. Se não especificado o padrão é 1024.

    O erro acontece no UTL_FILE.FCLOSE. Ao fechar o arquivo a linha é maior que o suportado, então da erro de escrita.

    Como existe essa limitação de 31k menos 1b, não será possível por os 200k como desejado direto.

    Uma alternativa é abrir o arquivo inicialmente em modo ‘W’ fechar o arquivo em seguida abrir o arquivo em modo ‘A’ e fecha lo novamente, desta forma é só fazer um loop ate terminar a linha.

    Creio que a escrita no arquivo é feita no FCLOSE e não no PUT.

    Segue um teste que eu fiz:


    create or replace directory diretorio as 'c:temp';


    create or replace procedure prc_save_text_archive(directory in Varchar2,name_archive in Varchar2) is
    text_archive utl_file.file_type;
    text varchar(30720);
    trinta_k_bytes number;
    begin
    trinta_k_bytes := 30720;

       /*salvando 30k*/
       text_archive := utl_file.fopen(directory,name_archive,'w',32767);
    
       for i in 1..trinta_k_bytes
       loop
           text := text || '1'  ;
       end loop;
    
       utl_file.put(text_archive,text);
    
       utl_file.fclose(text_archive);                  
    
       /*salvando 60k*/       
       text_archive := utl_file.fopen(directory,name_archive,'a',32767);
    
       text := null;
    
       for i in 1..trinta_k_bytes
       loop
           text := text || '0'  ;
       end loop;
    
       utl_file.put(text_archive,text);
    
       utl_file.fclose(text_archive);       
    
       /*salvando 90k*/
       text_archive := utl_file.fopen(directory,name_archive,'a',32767);
    
       text := null;
    
       for i in 1..trinta_k_bytes
       loop
           text := text || '1'  ;
       end loop;
    
       utl_file.put(text_archive,text);
    
       utl_file.fclose(text_archive);       
    

    end prc_save_text_archive;


    call prc_save_text_archive('DIRETORIO','TESTE.TXT');