使用SQL*Plus的SPOOL功能可高效將查詢結果導出為格式化文本文件。本文通過實例演示完整導出流程,涵蓋環境設置、腳本編寫、執行驗證。
SET ECHO OFF
SET FEEDBACK OFF
SET NEWPAGE NONE
SET PAGESIZE 50000
SET LINESIZE 20000
SET VERIFY OFF
SET PAGESIZE 0
SET TERM OFF
SET TRIMS ON
SET HEADING OFF
SET TRIMSPOOL ON
SET TRIMOUT ON
SET TIMING OFF
SET VERIFY OFF
SET COLSEP '|'
SPOOL d:\czrk.txt
SELECT sfzh || ',' || xm || ',' || xb || ','
|| csrq || ',' || mz || ',' || xzqh || ',' || jzdz
FROM m_czrk
WHERE ROWNUM <= 10000;
SPOOL OFF
| 命令 | 作用 |
|---|---|
| SET HEADING OFF | 隱藏列標題行 |
| SET COLSEP '|' | 列分隔符(示例中SQL用||','||手動拼接,雙重保險) |
| SET TRIMSPOOL ON | 去除輸出行尾空格 |
| SET PAGESIZE 0 | 禁用分頁,避免頁頭重複 |
| SET TERM OFF | 關閉終端顯示,提升性能 |
| SET FEEDBACK OFF | 隱藏"X rows selected"提示 |
-- 1. 連接數據庫
sqlplus dc/dc@mydb
-- 2. 執行腳本
SQL> @d:\czrk.sql
-- 3. 檢查生成文件
-- d:\czrk.txt 應包含10000行,每行格式:身份證,姓名,性別,出生日期,民族,行政區劃,戶籍地址
-- 使用游標循環分批,避免單次查詢內存壓力
DECLARE
v_file UTL_FILE.FILE_TYPE;
CURSOR c_data IS SELECT ...;
BEGIN
v_file := UTL_FILE.FOPEN('EXPORT_DIR', 'data.txt', 'W');
FOR r IN c_data LOOP
UTL_FILE.PUT_LINE(v_file, r.col1 || ',' || r.col2 || ...);
IF MOD(c_data%ROWCOUNT, 10000) = 0 THEN
UTL_FILE.FFLUSH(v_file);
END IF;
END LOOP;
UTL_FILE.FCLOSE(v_file);
END;
SELECT '"' || REPLACE(col1, '"', '""') || '","' ||
REPLACE(col2, '"', '""') || '"' ...
FROM table;
使用DBMS_PARALLEL_EXECUTE或手動分範圍啟動多會話並行SPOOL,最後合併文件。
AMERICAN_AMERICA.ZHS16GBK)LINESIZE(最大32767)TERM、FEEDBACK、ECHO;適度增大ARRAYSIZESQL*Plus SPOOL是輕量級數據導出的利器。掌握核心SET命令組合、腳本化操作、編碼設置、大數據量分批策略,能滿足絕多數文本導出需求。生產環境建議封裝為標準化導出框架,支持參數化查詢、多格式輸出、日志審計。