sql >> Databasteknik >  >> RDS >> Oracle

Hur man löser ORA-29285:filskrivfel

ORA-29285:filskrivfel är ett av de fel som kan uppstå när man utför filhantering i Oracle-databasen

Filhanteringsoperationer skapar en ny fil på operativsystemet, uppdaterar eller modifierar den. Denna funktion används ganska ofta i PLSQL för filmanipulation

Orsak och lösningar för ORA-29285

(1) Unix /Linux Filsystemet där du skriver filen är fullt, dvs. det används till 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

Upplösning

Frigör utrymmet i /u500  så kan vi kontrollera PLSQL-blocket igen

Så i princip måste du rensa de onödiga filerna i filsystemet som används. Se till att du inte tar bort några filer som för närvarande används. Om du tar bort några aktiva filer frigörs inte utrymme

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) När en fil öppnas av FOPEN såvida inte ett värde anges för parametern MAX_LINESIZE, kommer den att vara standard till 1024. Så det här felet inträffar också om du lägger in fler än 1024 tecken på raden

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

Upplösning

Vi kan förhindra detta fel genom att ange den maximala radstorleken

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.

Parametern MAX_LINESIZE kan vara upp till 32767. Om du har linjer längre än 32K ska data skrivas som binär.

(3)  Det här felet kan uppstå när du anropar UTL_FILE.PUT_LINE upprepade gånger i en loop när du skriver kumulativt mer än 1024  tecken. Orsaken är felaktig inställning av ORA_NLS10 eller variabeln ORA_NLS10 är inte inställd

Exempel

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

Upplösning

Se till att ORA_NLS10 är inställd i Oracle-databasen och lyssnarmiljön

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.

Jag hoppas att du gillar det här detaljerade inlägget på ORA-29285. Gilla det och ge feedback

Relaterade artiklar
ORA-29280:ogiltig katalogsökväg
ORA-29283:ogiltig filoperation
ORA-00942-tabell eller vy finns inte
ORA-29913
FND_FILE i oracle-appar
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm


  1. Använder flera fält för en unik nyckel i Prisma

  2. Hur ansluter jag till PostgreSQL utan att ange ett databasnamn?

  3. count(*) och count(column_name), vad är skillnaden?

  4. MySQL DROP TABELL