Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak rozwiązać ORA-29285:błąd zapisu pliku

ORA-29285:błąd zapisu pliku jest jednym z błędów, które mogą wystąpić podczas operacji obsługi plików w bazie danych Oracle

Operacje obsługi plików polegają na utworzeniu nowego pliku w systemie operacyjnym, jego aktualizacji lub modyfikacji. Ta funkcja jest często używana w PLSQL do manipulacji plikami

Powody i rozwiązania dla ORA-29285

(1) System plików Unix/Linux, w którym zapisujesz plik, jest pełny, tj. jest w 100% wykorzystany.

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

Rozdzielczość

Zwolnij miejsce w /u500 i możemy ponownie sprawdzić blok PLSQL

Więc w zasadzie musisz usunąć niepotrzebne pliki w używanym systemie plików. Upewnij się, że nie usuwasz żadnych plików, które są obecnie w użyciu.Jeśli usuniesz jakiekolwiek aktywne pliki, miejsce nie zostanie zwolnione

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) Gdy plik jest otwierany przez FOPEN, o ile nie określono wartości parametru MAX_LINESIZE, domyślnie będzie to 1024. Tak więc ten błąd występuje również, jeśli wstawisz więcej niż 1024 znaków w wierszu

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

Rozdzielczość

Możemy zapobiec temu błędowi, określając maksymalny rozmiar linii

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.

Parametr MAX_LINESIZE może wynosić do 32767. Jeśli masz linie dłuższe niż 32K, dane powinny być zapisane jako binarne.

(3) Ten błąd może wystąpić podczas wielokrotnego wywoływania UTL_FILE.PUT_LINE w pętli podczas zapisywania łącznie ponad 1024 znaków. Powód jest nieprawidłowy Ustawienie ORA_NLS10 lub zmienna ORA_NLS10 nie jest ustawiona

Przykład

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

Rozdzielczość

Upewnij się, że ORA_NLS10 jest ustawione w bazie danych Oracle i środowisku słuchacza

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.

Mam nadzieję, że spodobał Ci się ten szczegółowy post na ORA-29285. Polub to i przekaż opinię

Powiązane artykuły
ORA-29280:nieprawidłowa ścieżka katalogu
ORA-29283 :nieprawidłowa operacja na pliku
Tabela lub widok ORA-00942 nie istnieje
ORA-29913
FND_FILE w aplikacjach 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. ojdbc14.jar kontra ojdbc6.jar

  2. Jak eksportować dane za pomocą Oracle SQL Developer?

  3. SQLcl do przesyłania danych z Oracle do PostgreSQL lub YugabyteDB 🅾🐘🚀

  4. Jak mogę nadać alias tabeli w Oracle?

  5. Gdzie jest mój nieprawidłowy znak (ORA-00911)