sql >> Databáze >  >> RDS >> Oracle

Jak vyřešit ORA-29285:chyba zápisu do souboru

ORA-29285:Chyba zápisu do souboru je jednou z chyb, které se mohou objevit při provádění operace zpracování souborů v databázi Oracle

Operace manipulace se soubory jsou vytvoření nového souboru v operačním systému, jeho aktualizace nebo úprava. Tato funkce se v PLSQL používá poměrně často pro manipulaci se soubory

Důvod a řešení pro ORA-29285

(1) Systém souborů Unix/Linux, do kterého soubor zapisujete, je plný, tj. je 100% využitý.

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

Rozlišení

Uvolněte místo v /u500  a můžeme znovu zkontrolovat blok PLSQL

V zásadě tedy musíte vymazat nepotřebné soubory v používaném systému souborů. Ujistěte se prosím, že nesmažete žádné soubory, které se právě používají. Pokud smažete nějaké aktivní soubory, nebude místo uvolněno

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) Když je soubor otevřen pomocí FOPEN, pokud není zadána hodnota pro parametr MAX_LINESIZE, bude výchozí hodnota 1024. K této chybě tedy také dochází, pokud do řádku vkládáte více než 1024 znaků

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

Rozlišení

Této chybě můžeme předejít zadáním maximální velikosti řádku

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 může být až 32767. Pokud máte řádky delší než 32 kB, data by měla být zapsána jako binární.

(3)  K této chybě může dojít při opakovaném volání UTL_FILE.PUT_LINE ve smyčce při kumulativním zápisu více než 1024  znaků. Důvodem je nesprávné nastavení ORA_NLS10 nebo není nastavena proměnná ORA_NLS10

Příklad

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

Rozlišení

Ujistěte se, že je ORA_NLS10 nastaveno v prostředí databáze Oracle a posluchače

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.

Doufám, že se vám tento podrobný příspěvek na ORA-29285 líbí. Dejte prosím like a poskytněte zpětnou vazbu

Související články
ORA-29280:neplatná cesta k adresáři
ORA-29283:neplatná operace se souborem
Tabulka nebo zobrazení ORA-00942 neexistuje
ORA-29913
FND_FILE v aplikacích Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm


  1. Jak přejmenovat název sloupce nebo název tabulky v SQL Server - SQL Server / Kurz T-SQL, část 36

  2. Jak funguje klauzule „in“ v orákulu

  3. Seznámení s možnostmi a funkcemi v MariaDB SkySQL

  4. MySQL odstraní duplicitní záznamy, ale ponechá nejnovější