Vấn đề đầu tiên là có thể đường dẫn không tồn tại hoặc bạn không có quyền ghi trên thư mục.
SQL> select directory_path from all_directories where directory_name = 'YOUR DIRECTORY' ;
Nếu bạn không có hàng, bạn cần giải quyết vấn đề này bằng DBA của mình, vì thư mục không tồn tại hoặc bạn không có đặc quyền đối với nó. Thư mục cơ sở dữ liệu là sự kết hợp của hai yếu tố:
- Thư mục cơ sở dữ liệu là một con trỏ hoặc tham chiếu đến một vị trí trong hệ điều hành.
- Đường dẫn của thư mục đó phải tồn tại và người dùng chạy quy trình phải có đặc quyền đọc và ghi trên đó.
Đối với vấn đề thứ hai, vấn đề là người dùng sở hữu quy trình đã không được cấp đặc quyền hệ thống TẠO BẤT KỲ CHỈNH NÀO. DBA của bạn phải cấp đặc quyền TẠO BẤT KỲ TRỰC TIẾP cho người dùng của bạn, mặc dù tôi không khuyên bạn nên làm như vậy. Cấp BẤT KỲ đặc quyền nào là một phương pháp bảo mật không tốt.
Tạo thư mục thường là một nhiệm vụ đối với DBA của bạn. Tôi không lường trước được trường hợp khi bạn cần tạo chúng động, miễn là bạn cũng phải tạo thư mục cơ bản trong ổ đĩa Hệ thống tệp (Linux) hoặc Windows, tùy thuộc vào hệ điều hành của bạn.
Với hoàn cảnh đặc biệt của bạn, bạn không có lựa chọn nào khác với điều này. Bạn cần đánh giá lại giải pháp. Có lẽ bạn có thể sử dụng WRITETOCLOB thay vì WRITETOFILE, sau đó cuộn kết quả ở phía máy khách của bạn bằng sqlplus thay thế