Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да разрешите ORA-29285:грешка при запис на файл

ORA-29285:грешка при запис на файл е една от грешките, които могат да възникнат, докато извършвате операция за обработка на файлове в базата данни на Oracle

Операциите за обработка на файлове създават нов файл в операционната система, като го актуализират или модифицират. Тази функция се използва доста често в PLSQL за манипулиране на файлове

Причина и решения за ORA-29285

(1) Файловата система Unix/Linux, в която пишете файла, е пълна, т.е. използвана е на 100%.

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

Резолюция

Освободете мястото в /u500  и можем да проверим отново PLSQL блока

Така че основно трябва да изчистите ненужните файлове във файловата система, която се използва. Моля, уверете се, че не изтривате файлове, които се използват в момента. Ако изтриете активни файлове, място няма да бъде освободено

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) Когато файл се отвори от FOPEN, освен ако не е посочена стойност за параметъра MAX_LINESIZE, той по подразбиране ще бъде 1024. Така че тази грешка се случва и ако поставите повече от 1024 знака в реда

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

Резолюция

Можем да предотвратим тази грешка, като посочим максималния размер на линията

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.

Параметърът MAX_LINESIZE може да бъде до 32767. Ако имате редове, по-дълги от 32K, тогава данните трябва да бъдат записани като двоични.

(3)  Тази грешка може да възникне при  Извикване на UTL_FILE.PUT_LINE многократно в цикъл, когато се записват кумулативно повече от 1024  знака. Причината е неправилна настройка на ORA_NLS10 или променливата ORA_NLS10 не е зададена

Пример

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

Разделителна способност

Моля, уверете се, че ORA_NLS10 е зададен в базата данни на oracle и средата на слушател

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.

Надявам се да ви хареса тази подробна публикация на ORA-29285. Моля, харесайте го и дайте обратна връзка

Сродни статии
ORA-29280:невалиден път към директорията
ORA-29283 :невалидна файлова операция
Таблица или изглед на ORA-00942 не съществува
ORA-29913
FND_FILE в приложенията на Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да проверите максималния брой разрешени връзки към база данни на Oracle?

  2. Oracle (Oracle?) Joins - инструмент/скрипт за преобразуване?

  3. Oracle намери ограничение

  4. Разделете голям текстов/CSV файл на множество файлове в PL SQL

  5. Oracle Managed ODP.NET не може да намери tnsnames.ora