第二次运行代码尝试后ORA-01001

时间:2018-03-23 14:14:08

标签: c# oracle plsql

我有这样的代码

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的问题。你觉得怎么样?

1 个答案:

答案 0 :(得分:0)

我认为您的问题与open_cursors参数的值足够高有关。

在代码正文中,有一个步骤可以关闭光标,然后尝试调用已经关闭的光标。