sql >> Database >  >> RDS >> Oracle

Hoe ORA-29285 op te lossen:fout bij het schrijven van bestanden

ORA-29285:fout bij het schrijven van bestanden is een van de fouten die kunnen optreden tijdens het verwerken van bestanden in de Oracle-database

Bestandsverwerkingsbewerkingen zijn het maken van een nieuw bestand op het besturingssysteem, het bijwerken of wijzigen ervan. Deze functie wordt vrij vaak gebruikt in PLSQL voor bestandsmanipulatie

Reden en oplossingen voor ORA-29285

(1) Unix /Linux-bestandssysteem waarop u het bestand schrijft, is vol, d.w.z. het wordt 100% gebruikt.

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

Oplossing

Maak ruimte vrij in /u500 en we kunnen het PLSQL-blok opnieuw controleren

Dus eigenlijk moet u de onnodige bestanden wissen in het bestandssysteem dat wordt gebruikt. Zorg ervoor dat u geen bestanden verwijdert die momenteel in gebruik zijn. Als u actieve bestanden verwijdert, wordt er geen ruimte vrijgemaakt

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) Wanneer een bestand wordt geopend door FOPEN, tenzij er een waarde is opgegeven voor de parameter MAX_LINESIZE, wordt deze standaard ingesteld op 1024. Deze fout treedt dus ook op als u meer dan 1024 tekens in de regel plaatst

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

Oplossing

We kunnen deze fout voorkomen door de maximale lijngrootte op te geven

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.

De parameter MAX_LINESIZE kan maximaal 32767 zijn. Als u regels heeft die langer zijn dan 32K, moeten de gegevens als binair worden geschreven.

(3) Deze fout kan optreden wanneer UTL_FILE.PUT_LINE herhaaldelijk in een lus wordt aangeroepen bij het schrijven van cumulatief meer dan 1024 tekens. De reden is onjuist Instelling van ORA_NLS10 of de variabele ORA_NLS10 is niet ingesteld

Voorbeeld

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

Oplossing

Zorg ervoor dat ORA_NLS10 is ingesteld in de Oracle-database en luisteraaromgeving

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.

Ik hoop dat je dit gedetailleerde bericht op ORA-29285 leuk vindt. Vind het leuk en geef feedback

Gerelateerde artikelen
ORA-29280:ongeldig mappad
ORA-29283:ongeldige bestandsbewerking
ORA-00942-tabel of weergave bestaat niet
ORA-29913
FND_FILE in oracle-apps
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm


  1. Hoe phpMyAdmin op zijn eigen app te installeren

  2. Bereken uw SQL Server Monitoring Total Cost of Ownership

  3. hoe ISO-8601 Gregoriaanse datumtabel te maken in postgres

  4. MySQL-configuratievariabelen instellen - MySQL 5.7 versus MySQL 8.0