【问题标题】:ORA-01002 Fetch Out of Sequence with Temporary Table and .NetORA-01002 使用临时表和 .Net 提取序列
【发布时间】:2022-08-11 21:19:49
【问题描述】:

我在 Oracle 中有一个存储过程,我试图从 .Net Core 应用程序调用它。

proc 循环遍历游标以填充全局临时表,并尝试将结果作为引用游标发送回。

 Type ssp_rec_refcur Is Ref Cursor; -- Return ssp_rec;

 Procedure temp_table_sel(p_ssp_rec_refcur  Out ssp_rec_refcur) Is

    Cursor cur_main Is
      Select item1
            ,item2 etc..
        From regular_table;
  
  Begin
  
    For c_rec In cur_main Loop
          -execute some functions to get supplemtary data based on cursor row
           
          --store values in temp table for ref cursor
          Insert Into global_temp_table
          Values
            (c_rec.item1, c_rec.item2, c_rec.item3 etc...);

        End If;
      End If;
    End Loop;
    
    Open p_ssp_rec_refcur For
      Select * From global_temp_table;  
  
  Exception
    When Others Then
      log_error($$plsql_Unit, \'temp_table_sel\');
  End temp_table_sel;

这在对数据库本身进行测试时效果很好,但是当我尝试从 .Net 执行它时,我得到了错误:ora-01002 fetch out of sequence。

如果我提出一个承诺;在 select 语句之前的命令它消除了错误,但是表是空的,因为它在提交时删除了行;

如果我在 Select 语句之后放置一个 Commit,它会返回错误。

如何在不触发 Fetch Out of Sequence 错误的情况下将临时表行读入引用游标?

  • 我认为问题不在此程序范围内。检查从游标读取的代码,我假设您在获取最后一条记录后仍尝试从游标读取。
  • @MartinSchapendonk 我认为是 Oracle.ManagedDataAccess.dll 在事务后发送自动提交。

标签: oracle .net-core stored-procedures temp-tables oracle19c


【解决方案1】:

这就是我认为正在发生的事情。

问题是临时表是用属性“ON COMMIT DELETE ROWS;”定义的,所以当它在数据库端运行时它很好,因为没有提交。

但是,当从 .Net 调用它时,Oracle.ManagedDataAccess.dll 在每个事务结束时都会执行自动提交,这会导致临时表删除它的行,从而在我读取游标之前使其无效。

我的解决方法是将临时表设置为“ON COMMIT PRESERVE ROWS;”这样自动提交就不会删除它们,现在它会按预期读取光标。

我在proc中进行了更改以获取用户的会话ID并将其存储在临时表中,然后如果用户在同一会话中再次查询,则通过会话ID从表中删除以避免任何重复数据,因为它不会删除交易后自动。

【讨论】:

    【解决方案2】:

    这节省了我的时间!感谢 ON COMMIT PRESERVE ROWS 帮助我解决了我的问题

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2013-04-19
      • 2016-07-11
      • 1970-01-01
      • 2013-09-07
      • 2016-06-09
      • 1970-01-01
      相关资源
      最近更新 更多