Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách giải quyết ORA-29285:lỗi ghi tệp

ORA-29285:lỗi ghi tệp là một trong những lỗi có thể mắc phải khi thực hiện thao tác xử lý tệp trong cơ sở dữ liệu oracle

Các thao tác xử lý tệp là tạo một tệp mới trên Hệ điều hành, cập nhật hoặc sửa đổi tệp đó. Hàm này được sử dụng khá thường xuyên trong PLSQL để thao tác với tệp

Lý do và giải pháp cho ORA-29285

(1) Hệ thống tệp Unix / Linux nơi bạn đang ghi tệp đã đầy đủ i, e nó được sử dụng 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

Độ phân giải

Giải phóng dung lượng trong / u500 và chúng tôi có thể kiểm tra lại khối PLSQL

Vì vậy, về cơ bản bạn cần xóa các tệp không cần thiết trong hệ thống tệp đang được sử dụng. Hãy đảm bảo rằng bạn không xóa bất kỳ tệp nào hiện đang được sử dụng. Nếu bạn xóa bất kỳ tệp nào đang hoạt động, thì dung lượng sẽ không được giải phóng

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) Khi một tệp được FOPEN mở trừ khi một giá trị được chỉ định cho tham số MAX_LINESIZE, nó sẽ mặc định là 1024. Vì vậy, lỗi này cũng xảy ra nếu bạn đặt nhiều hơn 1024 ký tự vào dòng

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

Độ phân giải

Chúng tôi có thể ngăn lỗi này bằng cách chỉ định kích thước dòng tối đa

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.

Tham số MAX_LINESIZE có thể lên đến 32767. Nếu bạn có dòng dài hơn 32K thì dữ liệu phải được viết dưới dạng nhị phân.

(3) Lỗi này có thể xảy ra khi Gọi UTL_FILE.PUT_LINE liên tục trong một vòng lặp khi viết tích lũy hơn 1024 ký tự. Nguyên nhân là do Cài đặt ORA_NLS10 không chính xác hoặc biến ORA_NLS10 không được đặt

Ví dụ

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

Độ phân giải

Hãy đảm bảo ORA_NLS10 được đặt trong môi trường trình nghe và cơ sở dữ liệu oracle

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.

Tôi hy vọng bạn thích bài đăng chi tiết này trên ORA-29285. Hãy thích nó và cung cấp phản hồi

Các bài viết có liên quan
ORA-29280:đường dẫn thư mục không hợp lệ
ORA-29283:hoạt động tệp không hợp lệ
ORA-00942 bảng hoặc chế độ xem không tồn tại
ORA-29913
FND_FILE trong ứng dụng thần kỳ
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thực thi tệp tập lệnh .SQL bằng c #

  2. làm thế nào để tổng hợp kết nối trong java?

  3. Cách nhận thông tin đầu vào từ người dùng trong thời gian chạy

  4. Cách kết nối với cơ sở dữ liệu Oracle 11 từ. mạng

  5. làm thế nào để thay đổi ngày thành giờ trong oracle 10g