首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle UTL_FILE 寫入換行符控制與讀取本地文件

     編輯:程式設計綜合問答

問題

UTL_FILE.PUT_LINE 自動追加換行符,多次調用產生多行,需合併為單行;另需讀取本地文本文件。

解決方案

1. 避免換行:使用 PUT 替代 PUT_LINE

UTL_FILE.PUT(file_handle, CONVERT(p_str1, 'AL32UTF8', 'ZHS16GBK'));
UTL_FILE.PUT(file_handle, CONVERT(p_str2, 'AL32UTF8', 'ZHS16GBK'));
UTL_FILE.PUT(file_handle, CONVERT(p_str3, 'AL32UTF8', 'ZHS16GBK'));
UTL_FILE.NEW_LINE(file_handle);  -- 最後統一換行

2. 寫入後替換換行符(若已產生)

DECLARE
    v_content CLOB;
BEGIN
    -- 讀取文件到 CLOB
    SELECT UTL_FILE.GET_CLOB('DIR', 'file.txt') INTO v_content FROM dual;
    -- 替換
    v_content := REPLACE(v_content, CHR(10), '');  -- LF
    v_content := REPLACE(v_content, CHR(13), '');  -- CR
    -- 寫回
    UTL_FILE.PUT('DIR', 'file.txt', v_content);
END;

3. 讀取本地文本文件

CREATE OR REPLACE DIRECTORY ext_dir AS '/path/to/files';
-- 授權
GRANT READ, WRITE ON DIRECTORY ext_dir TO your_user;

DECLARE
    f_handle UTL_FILE.FILE_TYPE;
    v_line VARCHAR2(32767);
BEGIN
    f_handle := UTL_FILE.FOPEN('EXT_DIR', 'data.txt', 'R', 32767);
    LOOP
        BEGIN
            UTL_FILE.GET_LINE(f_handle, v_line);
            -- 處理 v_line
            DBMS_OUTPUT.PUT_LINE(v_line);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN EXIT;
        END;
    END LOOP;
    UTL_FILE.FCLOSE(f_handle);
END;

權限與目錄注意事項

  • Oracle 進程需對 OS 目錄有讀寫權限(Linux: chown oracle:oinstall /path)。
  • CREATE DIRECTORY 需 DBA 權限,路徑必須是服務器端絕對路徑,非客戶端路徑。
  • 大文件建議用 BFILE / DBMS_LOB 流式處理,避免 PGA 爆炸。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved