随机ORA-01403:在同一查询

时间:2017-03-02 08:38:24

标签: oracle plsql

我有一个PL / SQL包从java执行,带有SELECT INTO语句,它不会随机返回找不到数据的异常。如果我在错误后再次调用包,它可能会成功运行。

观察

  1. 有2个活跃用户错误计数几乎为0(300次执行时出错2次)。

  2. 对于活跃的应用程序用户,几乎每次执行都失败了(每10次执行9次错误)。

  3. 表有一个before insert触发器,它也很少失败。

  4. 表格经常更新,但我们查询的行在执行期间不会更新(包生成报告);

  5. 尝试解决方案

    1. 用CURSOR替换SELECT INTO。
    2. 在循环中执行相同的查询5次,延迟时间为5秒。
    3. 错误仍然是随机发生的。

      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;
      

1 个答案:

答案 0 :(得分:0)

问题出在VPD(虚拟专用数据库)上下文中。当VPD被禁用时,一切正常。

我认为VPD上下文因连接池冲突而失败,因为问题只发生在多个用户会话处于活动状态时。