PL/SQL存储过程如何判断是否从concurrent program中运行?
最优解决方案
直接调用Oracle EBS内置的FND_GLOBAL.CONC_REQUEST_ID函数即可,不需要查询任何表,性能远高于你现在用到的fnd_concurrent_requests查询方案。
这个函数的返回规则非常简单:
- 如果当前代码在并发请求会话中运行,返回对应请求的数字ID(值大于0)
- 如果不是从并发请求触发的运行,返回0
实现示例
你可以直接基于这个判断封装通用日志逻辑:
DECLARE l_conc_req_id NUMBER := fnd_global.conc_request_id; BEGIN IF l_conc_req_id > 0 THEN -- 并发请求运行场景,输出到并发管理器日志 fnd_file.put_line(fnd_file.log, '你要输出的日志内容'); ELSE -- 独立运行场景,输出到dbms_output dbms_output.put_line('你要输出的日志内容'); END IF; END; /
补充说明
- 所有标准EBS环境默认都开放
FND_GLOBAL包的访问权限,不需要额外做权限配置 - 如果你确实需要查询并发请求的其他扩展信息,要优化原查询的话,可以给
fnd_concurrent_requests的oracle_session_id字段新增索引,但绝大多数场景下用FND_GLOBAL.CONC_REQUEST_ID完全够用,不需要查表
内容的提问来源于stack exchange,提问作者Paul Moore
相关产品推荐
相关产品推荐

