遷移 Oracle Forms 6i→9i 時,內置警報函數失效,需改寫數千處調用。日常 PL/SQL 開發中,DBMS_OUTPUT.PUT_LINE('...') 重複編寫極其繁瑣。解決思路:封裝通用輸出過程/函數,構建輕量級消息庫。
-- 數值型快捷輸出
CREATE OR REPLACE PROCEDURE am (p_cnt NUMBER) AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Records updated: ' || p_cnt);
END;
/
-- 字符串型快捷輸出
CREATE OR REPLACE PROCEDURE ams (p_msg VARCHAR2) AS
BEGIN
DBMS_OUTPUT.PUT_LINE(p_msg);
END;
/
調用示例:am(46); → Records updated: 46;ams('Entering IF branch'); 即時定位代碼位置。
CREATE OR REPLACE PROCEDURE am (
p_prefix VARCHAR2,
p_suffix VARCHAR2 DEFAULT NULL
) AS
BEGIN
DBMS_OUTPUT.PUT_LINE(p_prefix || NVL(p_suffix, ''));
END;
/
用法:
EXEC am('Duplicates counted: ', 46); -- Duplicates counted: 46
EXEC am('Where am I?'); -- Where am I?
將多類型輸出歸類管理,避免過程名稱爆炸:
CREATE OR REPLACE PACKAGE msg_lib AS
PROCEDURE info (p_ctx VARCHAR2, p_val VARCHAR2);
PROCEDURE warn (p_ctx VARCHAR2, p_val VARCHAR2);
PROCEDURE debug (p_loc VARCHAR2, p_var_name VARCHAR2, p_val VARCHAR2);
PROCEDURE sql_cnt(p_dml VARCHAR2, p_cnt NUMBER);
END msg_lib;
/
CREATE OR REPLACE PACKAGE BODY msg_lib AS
PROCEDURE put(p_prefix VARCHAR2, p_suffix VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(p_prefix || p_suffix);
END;
PROCEDURE info (p_ctx VARCHAR2, p_val VARCHAR2) IS
BEGIN put('[INFO] ' || p_ctx, ': ' || p_val); END;
PROCEDURE warn (p_ctx VARCHAR2, p_val VARCHAR2) IS
BEGIN put('[WARN] ' || p_ctx, ': ' || p_val); END;
PROCEDURE debug(p_loc VARCHAR2, p_var VARCHAR2, p_val VARCHAR2) IS
BEGIN put('[DEBUG] ' || p_loc, ' - ' || p_var || '=' || p_val); END;
PROCEDURE sql_cnt(p_dml VARCHAR2, p_cnt NUMBER) IS
BEGIN put(p_dml || ' count:', p_cnt); END;
END msg_lib;
/
BEGIN
msg_lib.info ('BatchJob', 'Start');
msg_lib.debug('CalcBonus', 'v_rate', v_rate);
UPDATE emp SET sal = sal * v_rate;
msg_lib.sql_cnt('UPDATE emp', SQL%ROWCOUNT);
msg_lib.info ('BatchJob', 'End');
END;
/
輸出示例:
[INFO] BatchJob: Start [DEBUG] CalcBonus - v_rate=1.15 UPDATE emp count: 14 [INFO] BatchJob: End
CREATE OR REPLACE PACKAGE BODY msg_lib AS
$IF $$DEBUG_ENABLED $THEN
PROCEDURE put(...) IS BEGIN DBMS_OUTPUT.PUT_LINE(...); END;
$ELSE
PROCEDURE put(...) IS BEGIN NULL; END; -- 生產環境零開銷
$END
...
END;
編譯時指定 PLSQL_CCFLAGS = 'DEBUG_ENABLED:TRUE' 即可啟用,生產環境設為 FALSE 完全消除調用開銷。