Oracle 透過 CREATE DIRECTORY 將 OS 路徑映射為資料庫物件,再授權給使用者:
CREATE OR REPLACE DIRECTORY exp_dir AS '/tmp';
GRANT READ, WRITE ON DIRECTORY exp_dir TO eygle;
DECLARE
fh UTL_FILE.FILE_TYPE;
BEGIN
fh := UTL_FILE.FOPEN('UTL_FILE_DIR', 'example.txt', 'W');
UTL_FILE.PUT_LINE(fh, 'eygle test write one');
UTL_FILE.PUT_LINE(fh, 'eygle test write two');
UTL_FILE.FCLOSE(fh);
END;
/
DECLARE
fh UTL_FILE.FILE_TYPE;
buf VARCHAR2(4000);
BEGIN
fh := UTL_FILE.FOPEN('UTL_FILE_DIR', 'example.txt', 'R');
UTL_FILE.GET_LINE(fh, buf); DBMS_OUTPUT.PUT_LINE(buf);
UTL_FILE.GET_LINE(fh, buf); DBMS_OUTPUT.PUT_LINE(buf);
UTL_FILE.FCLOSE(fh);
END;
/
適用於圖片、PDF 等二進位檔:
DECLARE
v_bfile BFILE;
v_content VARCHAR2(1800);
v_amt INTEGER;
v_off INTEGER := 1;
BEGIN
v_bfile := BFILENAME('USER_DIR', 'test.txt');
v_amt := DBMS_LOB.GETLENGTH(v_bfile);
DBMS_LOB.OPEN(v_bfile);
DBMS_LOB.READ(v_bfile, v_amt, v_off, v_content);
DBMS_LOB.CLOSE(v_bfile);
DBMS_OUTPUT.PUT_LINE(v_content);
END;
/
-- 查看所有 DIRECTORY
SELECT * FROM dba_directories;
-- 刪除 DIRECTORY(不刪除 OS 檔案)
DROP DIRECTORY exp_dir;
chmod/ACL)。READ/WRITE,避免 PUBLIC 全開。PDB 級 DIRECTORY 隔離。DIRECTORY + UTL_FILE 處理文字檔,BFILE + DBMS_LOB 處理二進位檔,是 Oracle 與外部檔案系統交互的標準方式。善用 UTL_FILE.FGETATTR 檢查檔案存在與權限,可增強程式健壯性。