我有这样的代码
DBConnection.EnsureConnectionToDB()
private static OracleConnection con;
public static OracleConnection EnsureConnectionToDB()
{
if (con == null)
con = new OracleConnection();
if (con.State != ConnectionState.Open)
{
con.ConnectionString = "xxx";
con.Open();
}
return con;
}
的GetData()
public static void GetData()
{
OracleCommand cmd = new OracleCommand("procedure", DBConnection.EnsureConnectionToDB());
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("i_inv", OracleDbType.Decimal, 1, ParameterDirection.Input);
cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
OracleDataReader reader = cmd.ExecuteReader(); //here on second time I get ORA-01001
//some data maniupulation
cmd.Parameters.Clear();
cmd.Dispose();
}
在获取数据之前,我运行2-3另一个命令。
首次运行GetData()时,所有工作都顺利进行,但当我再次运行时,我得到了ORA-01001。
我们在600上打开游标。我要求db_admin将其放大到3000.但我认为它不会有帮助...
有什么想法吗?
修改 我坚持了一些线索。
在pl / sql中我得到了这个:
procedure procedure(
i_inv IN NUMBER
, p_cursor OUT sys_refcursor
)
as
vSQL varchar2(32000) := '';
v_dyn_cursor INTEGER;
v_dummy PLS_INTEGER;
begin
vSQL := 'SELECT 1 FROM DUAL';
v_dyn_cursor := DBMS_SQL.open_cursor;
DBMS_SQL.parse
(
v_dyn_cursor
, vSQL
, DBMS_SQL.native
);
v_dummy := DBMS_SQL.EXECUTE (v_dyn_cursor);
p_cursor := DBMS_SQL.to_refcursor (v_dyn_cursor);
end;
这可能是DBMS_SQL.TO_REFCURSOR的问题。你觉得怎么样?
答案 0 :(得分:0)
我认为您的问题与open_cursors
参数的值足够高有关。
在代码正文中,有一个步骤可以关闭光标,然后尝试调用已经关闭的光标。