ORA-01002 使用临时 Table 和 .Net 获取序列错误

ORA-01002 Fetch Out of Sequence with Temporary Table and .Net

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

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

 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 提取顺序错误。

如果我提交;在 select 语句之前的命令消除了错误,但是 table 然后是空的,因为它在提交时删除了行;

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

如何将临时 table 行读取到引用游标中而不触发“获取序列错误”?

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

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

然而,当从 .Net 调用它时,Oracle.ManagedDataAccess.dll 在每个 t运行saction 结束时执行自动提交,这导致临时 table 删除它的行,从而使无效在我阅读它之前移动光标。

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

我在 proc 中进行了更改以获取用户的会话 ID 并将其存储在临时 table 中,然后如果用户再次查询,则按会话 ID 从 table 中删除同一会话以避免任何重复数据,因为它不会在 t运行saction.

之后自动删除