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.
之后自动删除
我在 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.
之后自动删除