sql >> Database teknologi >  >> RDS >> Oracle

Sådan løses ORA-29285:fil skrivefejl

ORA-29285:filskrivefejl er en af ​​de fejl, der kan opstå, mens du udfører filhåndtering i Oracle-databasen

Filhåndteringsoperationer er at oprette en ny fil på operativsystemet, opdatere eller ændre den. Denne funktion bruges ret ofte i PLSQL til filmanipulation

Årsag og beslutninger for ORA-29285

(1) Unix /Linux Filsystem, hvor du skriver filen er fuld, dvs. den er 100 % brugt.

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

Opløsning

Frigør plads i /u500, og vi kan tjekke PLSQL-blokken igen

Så dybest set skal du rydde de unødvendige filer i det filsystem, der bruges. Sørg for, at du ikke sletter nogen filer, der er i brug i øjeblikket. Hvis du sletter aktive filer, frigives der ikke plads

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 åbnes af FOPEN, medmindre der er angivet en værdi for parameteren MAX_LINESIZE, vil den som standard være 1024. Så denne fejl opstår også, hvis du sætter mere end 1024 tegn i linjen

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

Opløsning

Vi kan forhindre denne fejl ved at angive den maksimale linjestørrelse

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.

Parameteren MAX_LINESIZE kan være op til 32767. Hvis du har linjer længere end 32K, skal dataene skrives som binære.

(3)  Denne fejl kan opstå, mens du kalder UTL_FILE.PUT_LINE gentagne gange i en løkke, når du skriver kumulativt mere end 1024 tegn. Årsagen er forkert indstilling af ORA_NLS10 eller variablen ORA_NLS10 er ikke indstillet

Eksempel

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

Opløsning

Sørg for, at ORA_NLS10 er indstillet i Oracle-databasen og lyttermiljøet

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.

Jeg håber, du kan lide dette detaljerede indlæg på ORA-29285. Synes godt om det og giv feedback

Relaterede artikler
ORA-29280:ugyldig mappesti
ORA-29283:ugyldig filoperation
ORA-00942-tabel eller visning findes ikke
ORA-29913
FND_FILE i oracle-apps
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm


  1. Opret en SSH-tunnel til MySQL-fjernadgang

  2. Afslutning af inaktive mysql-forbindelser

  3. Ydeevnejustering af hele forespørgselsplanen

  4. Den bedste måde at cache json på