PDA

View Full Version : UTL_FILE trong Oracle 9i ?



cuongdh
24-08-2004, 05:47
Làm thế nào để sử dụng được các Function của UTL_FILE trong Oracle 9i.
Làm ơn chỉ cho cách sử dụng.

andes
24-08-2004, 06:51
Trước khi sử dụng file UTL_FILE trong Oracle bạn phải setup tham số UTL_FILE_DIR trong file khởi tạo Init.ora
UTL_FILE_DIR = * (là mọi thư mục có thể truy cập được trên máy tính của U)
hoặc
UTL_FILE_DIR = <đường dẫn thư mục> (các procedure trong UTL_FILE chỉ thao tác với các file trong thư mục này)
Oracle user sau đó phải có quyền truy cập trên thư mục này thì mới có thể dùng các proc trong UTL_FILE. Để trao quyền trên thư mục ta có thể dùng lệnh như sau:
SQL> create directory THUMUC as <đường dẫn>
SQL> grant read on directory THUMUC to public (hoặc to specific users)
Sau đó có thể dùng hàm bình thường, nhớ prefix bằng UTL_FILE.
Chúc may mắn.

nganminh
28-08-2004, 02:43
andes thân mến,

Tớ cũng thử dùng UTL_FILE package nhưng hình như việc tạo DIRECTORY xong thì dù đã grand read .... nhưng vẫn chẳng tạo hay ghi vào file được. Tớ dùng Oracle Form 9i.

Regards

andes
28-08-2004, 04:24
Chào các bạn, sau đây là chương trình tui đã viết tử tế để giúp một người bạn. Chạy trên máy tui thì OK, nhưng chạy trên máy của him thì vẫn báo lỗi invalid_path. Tui dùng Oracle db version 9.0.1
Đầu tiên trong file init<SID>.ora (trong \oracle\ora90\database) bạn thêm dòng UTL_FILE_DIR = <đường dẫn> (SID là tên cơ sở dữ liệu của bạn)
Sau đó vào thoát sqlplus, vào services để restart lại database. Sau đó lại vào sqlplus. (à wên, mình viết thủ tục trong sqlplus, nếu bạn viết trong Procedure Builder hay Form builder thì chỉ cần restart lại database thui)

Trong thủ tục sau của mình thì UTL_FILE_DIR = H:\GAMES (không có dấu ngoặc đơn ngoặc kép quanh đường dẫn đâu) và cũng ko có create directory hay grant… cái này dành cho ver 9.2, tui dùng 9.0

Sau đó viết thủ tục như sau, bắt đầy đủ lỗi để nó ko báo lỗi linh tinh.

SQL> CREATE OR REPLACE PROCEDURE filewrite
IS
file_id UTL_FILE.FILE_TYPE;

BEGIN
file_id := utl_file.FOPEN('H:\GAMES', 'test.txt', 'w');
utl_file.PUT_LINE(file_id, 'hello, how are you?');
utl_file.fCLOSE(file_id);

EXCEPTION
WHEN utl_file.invalid_path THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_path');
WHEN utl_file.invalid_mode THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_mode');
WHEN utl_file.invalid_filehandle THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_filehandle');
WHEN utl_file.invalid_operation THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.invalid_operation');
WHEN utl_file.read_error THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.read_error');
WHEN utl_file.write_error THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.write_error');
WHEN utl_file.internal_error THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.internal_error');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'utl_file.other_error');
END;
/
Procedure created.

SQL> EXEC filewrite
PL/SQL procedure successfully completed.

Mọi người chạy thử xem sao. Tui ko hiểu nó còn mắc lỗi chỗ nào mà cậu bạn tui vẫn ko dùng được.