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