必须手动调用dbms_application_info.set_module和set_action标记会话,因v$session的module/action字段默认为空或仅为客户端名,无法自动反映存储过程名或执行位置;module宜用包名如'order_pkg',action宜用具体操作如'validate_stock',长度分别限48/32字节;需在关键逻辑节点动态更新action以定位卡点,事务结束前应重置为null;set_client_info可存轻量上下文如请求id,最大64字节,不参与client_identifier跟踪;所有标记仅当前会话有效,自治事务中需重新设置。
直接用 dbms_application_info.set_module 和 dbms_application_info.set_action 就能标记,但必须在 pl/sql 块里主动调用,不会自动生效。
为什么不能只靠 v$session 的 module/action 字段?
这些字段默认为空,Oracle 不会自动填入存储过程名或当前执行位置。不手动设置,查 v$session 时看到的 module 和 action 都是 NULL 或客户端工具名(比如 sqlplus.exe),对定位具体逻辑毫无帮助。
-
module是逻辑单元,比如'ORDER_PKG'、'INVENTORY_PROC',建议用包名或业务域命名 -
action是更细粒度的操作,比如'validate_stock'、'apply_discount',应反映当前正在做的具体事 - 两者长度有限制:
module_name最大 48 字节,action_name最大 32 字节,超长会被截断
如何在存储过程中动态更新 action 标记执行进度?
把 SET_ACTION 放在关键逻辑节点前,相当于给执行流打“路标”。一旦过程卡住,查 v$session 就能立刻知道停在哪一步。
- 不要只在开头设一次,要在循环体、分支入口、DML 操作前都调用
DBMS_APPLICATION_INFO.SET_ACTION - 避免硬编码字符串,可用常量或拼接变量,例如:
DBMS_APPLICATION_INFO.SET_ACTION('proc_id=' || p_order_id); - 事务提交或异常退出前,建议重置为
NULL,防止残留脏状态:DBMS_APPLICATION_INFO.SET_ACTION(NULL);
SET_CLIENT_INFO 能用来传什么信息?
SET_CLIENT_INFO 是补充字段,最大 64 字节,适合放轻量上下文,比如请求 ID、用户 ID、批次号——但别塞 JSON 或长路径。
- 它和
module/action独立存储,查v$session.client_info即可获取 - 常见误用:试图用它传调试堆栈或完整参数列表,结果被截断还污染监控视图
- 与
DBMS_SESSION.SET_IDENTIFIER不同,client_info不参与基于 client_identifier 的跟踪(如DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE)
真正容易被忽略的是:这些标记只对当前会话有效,且不会跨自治事务传播;如果过程里调了 PRAGMA AUTONOMOUS_TRANSACTION,新事务里得重新设 module/action,否则监控就断了。











