Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como resolver ORA-29285:erro de gravação de arquivo


ORA-29285:erro de gravação de arquivo é um dos erros que podem ocorrer durante a operação de manipulação de arquivos no banco de dados oracle

As operações de manipulação de arquivos estão criando um novo arquivo no sistema operacional, atualizando-o ou modificando-o. Esta função é usada com bastante frequência em PLSQL para manipulação de arquivos

Motivo e Resoluções para ORA-29285


(1) O sistema de arquivos Unix /Linux onde você está gravando o arquivo está cheio, ou seja, é 100% utilizado.
df -h /u500

/u500  100 0

declare
fileHandler UTL_FILE.FILE_TYPE;
begin
fileHandler := UTL_FILE.FOPEN('/u500', 'tech', 'W');
UTL_FILE.PUT_LINE(fileHandler, 'This is the file for test');
UTL_FILE.FCLOSE(fileHandler);
end;
/

DECLARE
*
ERROR at line 1:
ORA-29285: file write error
ORA-06512: at "SYS.UTL_FILE", line 4
ORA-06512: at "SYS.UTL_FILE", line 1169
ORA-06512: at line 6

Resolução

Libere o espaço em /u500  e podemos verificar novamente o bloco PLSQL

Então, basicamente, você precisa limpar os arquivos desnecessários no sistema de arquivos que está sendo usado. Certifique-se de não excluir nenhum arquivo que esteja em uso no momento. Se você excluir algum arquivo ativo, o espaço não será liberado
df -h /u500

/u500  80 20

declare
fileHandler UTL_FILE.FILE_TYPE;
begin
fileHandler := UTL_FILE.FOPEN('/u500', 'tech', 'W');
UTL_FILE.PUT_LINE(fileHandler, 'This is the file for test');
UTL_FILE.FCLOSE(fileHandler);
end;
/
  2    3    4    5    6
PL/SQL procedure successfully completed.

(2) Quando um arquivo é aberto pelo FOPEN, a menos que um valor seja especificado para o parâmetro MAX_LINESIZE, o padrão será 1024. Portanto, esse erro também ocorre se você estiver colocando mais de 1024 caracteres na linha
DECLARE
  file_name VARCHAR2(256) := 'test.lst';
  file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890....<2000 character>';
  file_id UTL_FILE.file_type;
BEGIN
  file_id := UTL_FILE.fopen('/tmp', file_name, 'W');
  UTL_FILE.put_line(file_id, file_text);
  UTL_FILE.fclose(file_id);

END;
/
DECLARE
*
ERROR at line 1:
ORA-29285: file write error
ORA-06512: at "SYS.UTL_FILE", line 2
ORA-06512: at "SYS.UTL_FILE", line 1169
ORA-06512: at line 6

Resolução

Podemos evitar esse erro especificando o tamanho máximo da linha
DECLARE
file_name VARCHAR2(256) := 'test.lst';
file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890....<2000 character>';
file_id UTL_FILE.file_type;
BEGIN
file_id := UTL_FILE.fopen('/tmp', file_name, 'W',5000);
UTL_FILE.put_line(file_id, file_text);
UTL_FILE.fclose(file_id);

END;
/

2 3 4 5 6 PL/SQL procedure successfully completed.

O parâmetro MAX_LINESIZE pode ser de até 32767. Se você tiver linhas com mais de 32 K, os dados devem ser gravados como binários.

(3)  Este erro pode ocorrer ao  Chamar UTL_FILE.PUT_LINE repetidamente em um loop ao escrever cumulativamente mais de 1.024  caracteres. O motivo está incorreto Configuração de ORA_NLS10 ou a variável ORA_NLS10 não está definida

Exemplo
unset ORA_NLS10

sqlplus / as sysdba

shutdown immediate

startup

sqlplus "/ as sysdba"

DECLARE
file_name VARCHAR2(256) := 'test.lst';
file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
file_id UTL_FILE.file_type;
BEGIN
file_id := UTL_FILE.fopen('/tmp', file_name, 'W');
FOR x IN 1..11 LOOP -- write 11 records
UTL_FILE.put_line(file_id, file_text);
END LOOP;

UTL_FILE.fclose(file_id);

END;

/

ORA-29285: file write error


Resolução

Certifique-se de que ORA_NLS10 esteja definido no banco de dados oracle e no ambiente do ouvinte
ORACLE_SID=TEST

ORA_NLS10=< >

sqlplus / as sysdba

shutdown

immediate

startup

lsnrctl stop TEST

lsnrctl start TEST

sqlplus / as sysdba

DECLARE
file_name VARCHAR2(256) := 'test.lst';
file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
file_id UTL_FILE.file_type;
BEGIN
file_id := UTL_FILE.fopen('/tmp', file_name, 'W');
FOR x IN 1..11 LOOP -- write 11 records
UTL_FILE.put_line(file_id, file_text);
END LOOP;

UTL_FILE.fclose(file_id);

END;

/

PL/SQL procedure successfully completed.

Espero que gostem deste post detalhado sobre ORA-29285. Por favor, dê like e dê feedback

Artigos relacionados
ORA-29280:caminho de diretório inválido
ORA-29283:operação de arquivo inválida
A tabela ou visualização ORA-00942 não existe
ORA-29913
FND_FILE em aplicativos oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm