12/08/2018, 18:04

UTL_FILE IN ORACLE

I. Giới thiệu: Là một package được Oracle tích hợp sẵn. UTL_FILE là package dùng để đọc ghi file hệ thống. Có thể truy cập file trong hệ thống được định nghĩa bằng phát biểu CREAT DIRECTORY. Đường dẫn file nên là đường dẫn file của Oracle. Xóa đường dẫn bằng phát biểu DROP DIRECTORY ...

I. Giới thiệu:

  • Là một package được Oracle tích hợp sẵn.
  • UTL_FILE là package dùng để đọc ghi file hệ thống.
  • Có thể truy cập file trong hệ thống được định nghĩa bằng phát biểu CREAT DIRECTORY.
  • Đường dẫn file nên là đường dẫn file của Oracle.
  • Xóa đường dẫn bằng phát biểu DROP DIRECTORY <directory_name>.
  • Ví dụ:
    Create directory my_dir AS ‘temp/myfiles’
	Grant Read, Write on Directory my_dir to public.

II. Một số hàm và thủ tục trong UTL_FILE package:

1. IS_OPEN

  • Xác định nếu một file đã được mở.
  • Dùng IS_OPEN để kiểm tra trạng thái file trước khi mở file.
  • Sử dụng:
UTL_FILE.IS_OPEN (
   file  IN FILE_TYPE)
  RETURN BOOLEAN;

2. FOPEN

  • Mở một file để đọc hoặc ghi dữ liệu.
UTL_FILE.FOPEN (
   location     IN VARCHAR2,
   filename     IN VARCHAR2,
   open_mode    IN VARCHAR2,
   max_linesize IN BINARY_INTEGER) –số kí tự tối đa trên mỗi dòng
  RETURN file_type;

Open_mode: r -- read text(get_line)
         w -- write text(put, put_line, new_line...)
         a -- append text(put, put_line, new_line...)
         rb -- read byte mode
         wb -- write byte mode
         ab -- append byte mode

3. FOPEN_NCHAR

  • Mở một file unicode để đọc hoặc ghi dữ liệu
UTL_FILE.FOPEN_NCHAR (
   location     IN VARCHAR2,
   filename     IN VARCHAR2,
   open_mode    IN VARCHAR2,-- (r,w,a,rb,wb,ab).
   max_linesize IN BINARY_INTEGER) 
RETURN file_type;

4. FCLOSE

  • Đóng 1 file
UTL_FILE.FCLOSE (
   file IN OUT FILE_TYPE);

5. FCLOSE_ALL

  • Đóng tất cả các file đang xử lí.
UTL_FILE.FCLOSE_ALL;

6. FCOPY

  • Sao chép một phần của file đến một file mới.
UTL_FILE.FCOPY (
   location   IN VARCHAR2,--directory file muốn copy
   filename   IN VARCHAR2,--tên file muốn copy
   dest_dir   IN VARCHAR2,-- directory file đích
   dest_file  IN VARCHAR2,--tên file đích
   start_line IN PLS_INTEGER DEFAULT 1,
   end_line   IN PLS_INTEGER DEFAULT NULL);

7. FGETATTR

  • Đọc và trả về những thuộc tính của file
UTL_FILE.FGETATTR(
   location    IN VARCHAR2, 
   filename    IN VARCHAR2, 
   exists      OUT BOOLEAN, --trả về true nếu file tồn tại
   file_length OUT NUMBER, --NULL nếu file không tt
   blocksize   OUT NUMBER); --NULL nếu file không tt

8. FGETPOS

  • Lấy vị trí hiện tại trong file
UTL_FILE.FGETPOS (
   fileid IN file_type)-- directory
 RETURN PLS_INTEGER;

9. FREMOVE

  • Xóa file(nếu có đủ quyền)
UTL_FILE.FREMOVE (
   location IN VARCHAR2,
   filename IN VARCHAR2);

10. FRENAME

  • Đổi tên file đã tồn tại thành một tên mới
UTL_FILE.FRENAME (
   location  IN VARCHAR2,
   filename  IN VARCHAR2, 
   dest_dir  IN VARCHAR2,
   dest_file IN VARCHAR2,
   overwrite IN BOOLEAN DEFAULT FALSE);--ghi đè nếu file đã tồn tại. Mặc định: false

11. FSEEK

  • Di chuyển(điều chỉnh) vị trí con trỏ chuột trong file
UTL_FILE.FSEEK (
   fid             IN utl_file.file_type,
   absolute_offset IN PL_INTEGER DEFAULT NULL,--vị trí muốn chuyển đến
   relative_offset IN PLS_INTEGER DEFAULT NULL);

+) relative_offset: số âm:dịch chuyển lùi
                    Số dương: dịch chuyển về phía trước
                    0: giữ nguyên vị trí hiện tại

12. PUT

  • Ghi một chuỗi vào file đang mở
UTL_FILE.PUT (
   file      IN FILE_TYPE,
   buffer    IN VARCHAR2);
+)file: directory file, file phải đang mở
+)buffer: nội chung chuỗi muốn ghi

13. PUT_NCHAR

  • Ghi một chuỗi Unicode vào file đang mở
UTL_FILE.PUT (
   file      IN FILE_TYPE,
   buffer    IN VARCHAR2);

14. PUT_LINE

  • Ghi một dòng vào file và phụ thuộc vào số kí tự trong một dòng của hệ điều hành.
UTL_FILE.PUT_LINE (
   file      IN FILE_TYPE,
   buffer    IN VARCHAR2,
   autoflush IN BOOLEAN DEFAULT FALSE);

15. GET_LINE

  • Đọc văn bản từ file
UTL_FILE.GET_LINE (
   file        IN  FILE_TYPE,
   buffer      OUT VARCHAR2,
   len         IN  PLS_INTEGER DEFAULT NULL);
+)file phải được mở với mode: ‘r’
+)buffer: chuỗi tạm để nhận dữ liệu từ file
+)len: số bytes đọc từ file

16. NEW_LINE

  • Thêm một hoặc nhiều kí tự kết thúc dòng vào file
UTL_FILE.NEW_LINE (
   file     IN FILE_TYPE,
   lines    IN NATURAL := 1);

17. FFLUSH

  • Viết tất cả dữ liệu trong bộ nhớ tạm vào file
UTL_FILE.FFLUSH (
   file  IN FILE_TYPE);

III. Tiến trình sử dụng UTL_FILE:

a. Một số exception được định nghĩa sẵn trong UTL_FILE package, oracle

Tên Mô tả
INVALID_PATH Vị trí file không tồn tại
INVALID_MODE Tham số trong hàm FOPEN không đúng
INVALID_FILEHANDLE File đang xử lí không tồn tại
INVALID_OPERATION Không thể mở file hoặc hệ thống không phản hồi
READ_ERROR Hệ thống xảy ra lỗi khi đọc file
WRITE_ERROR Hệ thống xảy ra lỗi khi ghi file

IV. Demo:

a. Tạo đường dẫn cho file cần đọc ghi:

  • Kiểm tra xem đường dẫn có tên My_dir có được tạo bằng câu lệnh:
Select directory_name, directory_path
From all_directories
WHERE directory_name= 'MY_DIR';

=> KQ:

b. Khai báo package có tên RW_FILE dùng để đọc ghi file hệ thống:

CREATE OR REPLACE PACKAGE RW_FILE 
AS
  sp_readFile(myDir varchar2, fileName varchar2);
  sp_WriteFile(myDir varchar2, fileName varchar2, buffer varchar2);
END RW_FILE;

Package RW_FILE gồm 2 stored procedure sử dụng package UTL_FILE để đọc, ghi file hệ thống :

  • sp_readFile: dùng để đọc file hệ thống.
  • sp_WriteFile: dùng để ghi một chuỗi input vào file hệ thống.

c. Tạo thân của package RW_FILE:

CREATE OR REPLACE PACKAGE BODY RW_FILE 
AS
  PROCEDURE sp_readFile(myDir varchar2, fileName varchar2)
    AS
      f_file UTL_FILE.FILE_TYPE;
      buffer varchar2(200);
      lines PLS_INTEGER := 0;
    BEGIN
      IF NOT UTL_FILE.IS_OPEN(f_file) then
        f_file := UTL_FILE.FOPEN(myDir, fileName, 'R');
        BEGIN
          LOOP 
            UTL_FILE.GET_LINE(f_file, buffer);
            DBMS_OUTPUT.PUT_LINE(buffer);
          END LOOP;
          EXCEPTION 
            WHEN NO_DATA_FOUND THEN 
              DBMS_OUTPUT.PUT_LINE('END OF FILE');
            WHEN UTL_FILE.INVALID_FILEHANDLE THEN
              RAISE_APPLICATION_ERROR(-20001,'Invalid File.');
            WHEN UTL_FILE.READ_ERROR THEN
              RAISE_APPLICATION_ERROR (-20002, 'Unable to read to file');
        END;
        UTL_FILE.FCLOSE(f_file);
      END IF;
    END sp_readFile;
  PROCEDURE sp_WriteFile(myDir varchar2, fileName varchar2, buffer varchar2)
    AS
      f_file UTL_FILE.FILE_TYPE;
    BEGIN
       IF NOT UTL_FILE.IS_OPEN(f_file) then
        f_file := UTL_FILE.FOPEN(myDir, fileName, 'A');
        BEGIN 
            UTL_FILE.PUT(f_file, buffer);
            UTL_FILE.PUT(f_file, ',');
            DBMS_OUTPUT.PUT_LINE(buffer);
          EXCEPTION 
            WHEN NO_DATA_FOUND THEN 
              DBMS_OUTPUT.PUT_LINE('END OF FILE');
            WHEN UTL_FILE.INVALID_FILEHANDLE THEN
              RAISE_APPLICATION_ERROR(-20001,'Invalid File.');
            WHEN UTL_FILE.WRITE_ERROR THEN
              RAISE_APPLICATION_ERROR (-20002, 'Unable to write to file');
        END;
        UTL_FILE.FCLOSE(f_file);
      END IF;
    END sp_WriteFile;
END RW_FILE;

V.

0