2010-05-01 23 views
19

Tôi đang cố viết một tệp được lưu trữ trong c: \ drive có tên vin1.txt và gặp phải lỗi này. Vui lòng đề xuất!Thủ tục UTL_FILE.FOPEN() không chấp nhận đường dẫn cho thư mục?

> ERROR at line 1: ORA-29280: invalid 
> directory path ORA-06512: at 
> "SYS.UTL_FILE", line 18 ORA-06512: at 
> "SYS.UTL_FILE", line 424 ORA-06512: at 
> "SCOTT.SAL_STATUS", line 12 ORA-06512: 
> at line 1 

ĐÂY là mã

create or replace procedure sal_status 
    (
    p_file_dir IN varchar2, 
    p_filename IN varchar2) 
    IS 
    v_filehandle utl_file.file_type; 
    cursor emp Is 
     select * from employees 
     order by department_id; 
    v_dep_no departments.department_id%TYPE; 
    begin 
     v_filehandle :=utl_file.fopen(p_file_dir,p_filename,'w');--Opening a file 
     utl_file.putf(v_filehandle,'SALARY REPORT :GENERATED ON %s\n',SYSDATE); 
     utl_file.new_line(v_filehandle); 
     for v_emp_rec IN emp LOOP 
      v_dep_no :=v_emp_rec.department_id; 
      utl_file.putf(v_filehandle,'employee %s earns:s\n',v_emp_rec.last_name,v_emp_rec.salary);      
     end loop; 
     utl_file.put_line(v_filehandle,'***END OF REPORT***'); 
     UTL_FILE.fclose(v_filehandle); 
    end sal_status; 

execute sal_status('C:\','vin1.txt');--Executing 

Trả lời

32

Kể từ Oracle 9i có là hai cách hoặc khai báo một thư mục để sử dụng với UTL_FILE.

Cách cũ hơn là đặt tham số INIT.ORA UTL_FILE_DIR. Chúng tôi phải khởi động lại cơ sở dữ liệu để thay đổi có hiệu lực. Giá trị có thể giống như bất kỳ biến PATH nào khác; nó chấp nhận ký tự đại diện. Sử dụng phương pháp này có nghĩa là chuyển đường dẫn thư mục ...

UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W'); 

Cách tiếp cận khác là khai báo đối tượng thư mục.

create or replace directory temp_dir as 'C:\temp' 
/

grant read, write on directory temp_dir to vineet 
/

Đối tượng thư mục yêu cầu đường dẫn tệp chính xác và không chấp nhận ký tự đại diện. Trong phương pháp này, chúng tôi vượt qua tên đối tượng thư mục ...

UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W'); 

Các UTL_FILE_DIR bị phản đối bởi vì nó vốn đã không an toàn - tất cả người dùng có quyền truy cập vào tất cả các thư mục hệ điều hành theo quy định tại các con đường, trong khi đọc và viết đặc quyền có thể bỏ được cấp riêng cho người dùng cá nhân. Ngoài ra, với các đối tượng Directory, chúng ta có thể thêm, loại bỏ hoặc thay đổi các thư mục mà không cần trả lại cơ sở dữ liệu.

Trong cả hai trường hợp, người dùng hệ điều hành oracle phải có quyền đọc và/hoặc viết trên thư mục OS. Trong trường hợp không rõ ràng, điều này có nghĩa là thư mục phải được hiển thị từ máy chủ cơ sở dữ liệu. Vì vậy, chúng ta không thể sử dụng một trong hai cách tiếp cận để trưng ra một thư mục trên máy tính cục bộ của chúng ta đến một tiến trình đang chạy trên một máy chủ cơ sở dữ liệu từ xa. Tệp phải được tải lên máy chủ cơ sở dữ liệu hoặc ổ đĩa mạng được chia sẻ.


Nếu người dùng oracle OS không có đặc quyền thích hợp vào thư mục hệ điều hành, hoặc nếu con đường được quy định trong cơ sở dữ liệu không phù hợp với một đường dẫn thực tế, chương trình sẽ ném ngoại lệ này:

ORA-29283: invalid file operation 
ORA-06512: at "SYS.UTL_FILE", line 536 
ORA-29283: invalid file operation 
ORA-06512: at line 7 

các OERR văn bản cho lỗi này là khá rõ ràng:

29283 - "invalid file operation" 
*Cause: An attempt was made to read from a file or directory that does 
      not exist, or file or directory access was denied by the 
      operating system. 
*Action: Verify file and directory access privileges on the file system, 
      and if reading, verify that the file exists. 
+0

Bạn có thể kết hợp với các thư mục khác không? ví dụ: UTL_FILE.FOPEN ('TEMP_DIR' || '/ otherFolder', 'vineet.txt', 'W'); Tôi muốn biết nếu có thể. PATH của FTP SERVER/.../... / – delive

0

Bạn cần có DBA của bạn sửa đổi các tập tin init.ora, thêm các thư mục mà bạn muốn truy cập vào các thông số 'utl_file_dir'. Ví dụ cơ sở dữ liệu của bạn sau đó sẽ cần phải được dừng lại và khởi động lại vì init.ora chỉ đọc khi cơ sở dữ liệu được đưa lên.

Bạn có thể xem (nhưng không thay đổi) tham số này bằng cách chạy truy vấn sau đây:

SELECT * 
    FROM V$PARAMETER 
    WHERE NAME = 'utl_file_dir' 

Chia sẻ và thưởng thức.

3

Bạn cần register the directory với Oracle. fopen lấy tên của một đối tượng thư mục, không phải là đường dẫn. Ví dụ:

(bạn có thể cần phải đăng nhập như SYS để thực hiện những)

CREATE DIRECTORY MY_DIR AS 'C:\'; 

GRANT READ ON DIRECTORY MY_DIR TO SCOTT; 

Sau đó, bạn có thể tham khảo nó trong các cuộc gọi đến fopen:

execute sal_status('MY_DIR','vin1.txt'); 
+0

Lưu ý: phương pháp này không có sẵn trong các phiên bản cũ hơn của Oracle (trước 9 tôi nghĩ), nơi bạn có thể cần phải đặt utl_file_dir thay thế. Tôi nghĩ rằng –

5

Đừng quên cũng là đường dẫn cho tập tin là trên máy chủ oracle thực tế và không bất kỳ Loca l máy phát triển có thể được gọi là thủ tục lưu trữ của bạn. Điều này có lẽ rất rõ ràng nhưng cái gì đó nên được ghi nhớ.

1

Đối với utl_file.open (vị trí, tên tệp, chế độ), chúng tôi cần cung cấp tên thư mục cho vị trí chứ không phải đường dẫn. Ví dụ: DATA_FILE_DIR, đây là tên thư mục và kiểm tra đường dẫn thư mục cho tên thư mục cụ thể đó.

0

Tên thư mục có vẻ phân biệt chữ hoa chữ thường. Tôi phải đối mặt với cùng một vấn đề nhưng khi tôi cung cấp tên thư mục trong trường hợp trên nó làm việc.

Các vấn đề liên quan