第二次运行代码尝试后出现 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”

ORA-01001 无效游标错误

PL/SQL:游标使用中的 ORA-01001

过程(PL/SQL 包)中的“ORA-01001 无效游标”

第 2 次运行代码后出现 C 双重释放错误

我在写游标时收到错误 ORA-01001 Invalid cursor show even number of records