第二次运行代码尝试后出现 ORA-01001
Posted
技术标签:
【中文标题】第二次运行代码尝试后出现 ORA-01001【英文标题】:ORA-01001 after second running code attempt 【发布时间】:2018-03-23 14:14:08 【问题描述】:我有这样的代码
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 可能有问题。你怎么看?
【问题讨论】:
您的代码表明您正在重用或缓存OracleConnection
,这几乎肯定不是您想要做的。尽可能限制范围,将东西包装在using
中,让连接池负责缓存。否则,你必须做一些事情,比如每当错误导致连接不可用时重新创建连接。
感谢您的回答。你能告诉更多我需要做什么吗?
【参考方案1】:
我认为您的问题与open_cursors
参数的值不够高有关。
似乎在代码主体中,有一个步骤可以关闭光标,然后尝试调用已关闭的光标。
【讨论】:
不,我很确定,我没有关闭它。以上是关于第二次运行代码尝试后出现 ORA-01001的主要内容,如果未能解决你的问题,请参考以下文章
过程中出现奇怪的错误“Ora-01001 Invalid cursor”
过程(PL/SQL 包)中的“ORA-01001 无效游标”
我在写游标时收到错误 ORA-01001 Invalid cursor show even number of records