我有一个PL / SQL包从java执行,带有SELECT INTO语句,它不会随机返回找不到数据的异常。如果我在错误后再次调用包,它可能会成功运行。
观察
有2个活跃用户错误计数几乎为0(300次执行时出错2次)。
对于活跃的应用程序用户,几乎每次执行都失败了(每10次执行9次错误)。
表有一个before insert触发器,它也很少失败。
表格经常更新,但我们查询的行在执行期间不会更新(包生成报告);
尝试解决方案
错误仍然是随机发生的。
BEGIN
t_utility.init( p_log_level => '70', p_application => 'MFG', p_exe_reqst_id => p_cut_id);
t_utility.info('Report Begins'||p_cut_id||' '||p_report_size);
FOR i IN 1..5
LOOP
BEGIN
-- Fecthing the header details
SELECT div.divisiont_code
, fac.facility_code
, cut_reg.cut_num
, cut_reg.lay_date
, cut_reg.revision_number
, cut_reg.shrinkage
, cut_reg.document_no
, cut_reg.marker_name_method
INTO l_division
, l_facilty
, l_doc_no
, l_date
, l_rev
, l_shrinkage
, l_cut_reg_num
, l_marker_name
FROM mfg.cut_regstr cut_reg
, tnz.division div
, tnz.facility fac
WHERE cut_reg.op_code = 'C'
AND div.id = cut_reg.division
AND fac.id(+) = cut_reg.facility
AND cut_reg.cut_regstr_id = p_cut_id; --p_cut_id is an input parameter;
l_exit_flag := 1;
EXCEPTION
WHEN no_data_found THEN
t_utility.error('Header '||sqlerrm);
--raise l_abort_package_exe;
l_exit_flag := 0;
WHEN OTHERS THEN
t_utility.error('Header '||sqlerrm);
l_exit_flag := 0;
-- raise l_abort_package_exe;
END;
IF l_exit_flag = 1 THEN
EXIT;
END IF;
sys.DBMS_LOCK.sleep (5);
END LOOP;
IF l_exit_flag = 0 THEN
t_utility.error('Completed 5 iterations but result not found');
raise l_abort_package_exe;
END IF;
答案 0 :(得分:0)
问题出在VPD(虚拟专用数据库)上下文中。当VPD被禁用时,一切正常。
我认为VPD上下文因连接池冲突而失败,因为问题只发生在多个用户会话处于活动状态时。