Oracle Forms 12c初始化调用WEBUTIL_HOST报错,求启动后实现方案
解决Oracle Forms初始化时调用WEBUTIL_HOST报错的问题
问题根源
WHEN-NEW-FORM-INSTANCE属于表单初始化的早期触发点,此时WebUtil的Host bean还未完成初始化绑定,直接调用WEBUTIL_HOST.Blocking()会因找不到bean报错;而后续用户交互触发的触发器(如WHEN-TAB-PAGE-CHANGED)执行时,WebUtil组件已完成加载,因此能正常运行。
可行解决方案
方案1:使用延迟定时器触发调用
通过创建短延迟定时器,等待WebUtil初始化完成后再执行客户端信息获取逻辑:
- 在WHEN-NEW-FORM-INSTANCE触发器中添加代码,创建延迟定时器:
DECLARE timer_id TIMER; BEGIN -- 创建1秒延迟的一次性定时器(可根据实际加载速度调整毫秒值) timer_id := CREATE_TIMER('INIT_CLIENT_INFO_TIMER', 1000, NO_REPEAT); END;
- 创建WHEN-TIMER-EXPIRED触发器,处理定时器触发逻辑:
DECLARE timer_name VARCHAR2(100); BEGIN timer_name := GET_TIMER_NAME(:SYSTEM.TIMER_ID); IF timer_name = 'INIT_CLIENT_INFO_TIMER' THEN -- 调用WebUtil执行客户端命令 WEBUTIL_HOST.Blocking('whoami'); -- 此处可添加结果处理逻辑,如将输出存入变量或表单字段 END IF; END;
方案2:直接使用WebUtil客户端信息API(更推荐)
如果只是获取客户端用户名等基础信息,无需调用外部whoami命令,可直接使用WebUtil内置的客户端信息包,避免依赖Host组件的初始化:
DECLARE v_client_username VARCHAR2(100); BEGIN -- 直接获取客户端系统用户名 v_client_username := WEBUTIL_CLIENTINFO.GET_USER_NAME; -- 处理获取到的信息,如赋值给表单变量或写入日志 :GLOBAL.CLIENT_USER := v_client_username; END;
该API的初始化时机更早,通常能在表单初始化阶段正常调用,无需额外延迟。
注意事项
- 若使用方案1,需根据表单实际加载速度调整定时器延迟时间(如2000毫秒),确保WebUtil组件完全初始化。
- 确认WebUtil配置正确:
webutil.cfg中已启用Host组件,formsweb.cfg中配置了WebUtil相关参数(如archive=frmall.jar, webutil.jar)。
内容的提问来源于stack exchange,提问作者diobmoz
相关产品推荐
相关产品推荐

