在開發與維護 Oracle PL/SQL 程序時,即時查看變數值、執行流程等除錯資訊至關重要。本文整理了三種常見的輸出方法,分別適用於不同資料量與場景,助您高效定位問題。
在 BEGIN ... END 區塊中隨處可呼叫 DBMS_OUTPUT.PUT_LINE(output) 將字串寫入緩衝區,再由客戶端工具(如 SQL*Plus、PL/SQL Developer)啟用 SET SERVEROUTPUT ON 顯示。
DECLARE
v_output VARCHAR2(200);
BEGIN
v_output := '除錯資訊:變數值 = ' || some_variable;
DBMS_OUTPUT.PUT_LINE(v_output);
END;
限制: 單次呼叫最多輸出 255 字元(Oracle 10g 起已放寬至 32,767 字元)。DBMS_OUTPUT.ENABLE(20000) 僅設定整個會話的緩衝區總大小,無法突破單行上限。
建立一張擁有 VARCHAR2(4000) 欄位的表,程式中以動態 SQL 寫入,事後查表即可。適合數千字元的中等資料量。
-- 1. 建表
CREATE TABLE my_output (
id NUMBER(4),
txt VARCHAR2(4000)
);
-- 2. 程式寫入
DECLARE
v_output VARCHAR2(4000);
v_sql VARCHAR2(4500);
v_cnt NUMBER(4) := 0;
BEGIN
-- 清空舊資料
EXECUTE IMMEDIATE 'TRUNCATE TABLE my_output';
v_output := '大量除錯資訊...';
v_cnt := v_cnt + 1;
v_sql := 'INSERT INTO my_output VALUES (:1, :2)';
EXECUTE IMMEDIATE v_sql USING v_cnt, v_output;
COMMIT;
END;
查詢時:SELECT * FROM my_output ORDER BY id;
當資料量超過表欄位上限(如 30,000 字元),需寫入外部檔案。需先建立 DIRECTORY 物件並授權。
-- 1. 建立目錄物件 (需 DBA 權限)
CREATE OR REPLACE DIRECTORY TMP_DIR AS 'D:\testtmp';
GRANT READ, WRITE ON DIRECTORY TMP_DIR TO your_user;
-- 2. 程式寫檔
DECLARE
v_file UTL_FILE.FILE_TYPE;
v_output VARCHAR2(30000);
BEGIN
v_output := '超大量除錯資訊...';
v_file := UTL_FILE.FOPEN('TMP_DIR', 'output.txt', 'W', 32767);
UTL_FILE.PUT_LINE(v_file, v_output);
UTL_FILE.FCLOSE(v_file);
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
RAISE_APPLICATION_ERROR(-20000, '目錄路徑無效或未在資料庫中建立');
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(v_file) THEN
UTL_FILE.FCLOSE(v_file);
END IF;
RAISE;
END;
關鍵參數: FOPEN 的第四參數 max_linesize 預設 1023,最大 32767,必須大於單行資料長度。
DBMS_OUTPUT,最輕量。UTL_FILE 寫檔,注意目錄權限與路徑。實務上常搭配使用:開發階段用 DBMS_OUTPUT,測試環境寫表留存,正式環境排查疑難雜症時落地檔案分析。