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