Превышены максимальные открытые курсоры ORA-01000 в C#

Я просмотрел некоторые похожие посты и попробовал несколько вещей, но они не сработали. Следовательно, разместив свой собственный запрос здесь. По сути, я написал пакетный процесс, который выполняет много вызовов хранимых процедур Oracle. Я использую библиотеку System.Data.OracleClient, которая доступна в .Net Framework. В своей хранимой процедуре я написал запрос на выборку и открыл курсор, который возвращается обратно в вызывающее приложение, т.е. в пакетный процесс.

Вот моя хранимая процедура ->

create or replace 
PROCEDURE "SP_MYSTOREDPROCEDURE"
(param1 in varchar2,
 param2 in varchar2,
 param3 in varchar2,
 param4 in varchar2,
 param5 out sys_refcursor)

as
selectQuery varchar2(200);
begin
// My select query here.

open param5 for 
selectQuery; 
end SP_MYSTOREDPROCEDURE;

Вот мой код C#, который вызывает хранимую процедуру.

    DataSet fetchedData;
        fetchedData = new DataSet();
        string etdmConnString = GetConfigurationValue("my connection string");
        try
        {
            OracleParameter outRefCursor = new OracleParameter("param5", OracleType.Cursor);
            outRefCursor.Direction = ParameterDirection.Output;

            //using (OracleConnection objConnETDM = new OracleConnection(etdmConnString))
            OracleConnection objConnETDM = new OracleConnection(etdmConnString);
            //{
                //using (OracleCommand objCmd = new OracleCommand())
            OracleCommand objCmd = new OracleCommand();
                //{
                    if (objConnETDM.State != ConnectionState.Open)
                        objConnETDM.Open();

                    objCmd.Connection = objConnETDM;
                    objCmd.CommandText = GetConfigurationValue("SP_MYSTOREDPROCEDURE");
                    objCmd.CommandType = CommandType.StoredProcedure;
                    objCmd.Parameters.Clear();
                    objCmd.Parameters.Add("param1", OracleType.VarChar).Value = param1_value;
                    objCmd.Parameters.Add("param2", OracleType.VarChar).Value = param2_value;
                    objCmd.Parameters.Add("param3", OracleType.VarChar).Value = param3_value;
                    objCmd.Parameters.Add("param4", OracleType.VarChar).Value = param4_value;
                    //objCmd.Parameters.Add("param5", OracleType.Cursor).Direction = ParameterDirection.Output;
                    objCmd.Parameters.Add(outRefCursor);
                    objCmd.ExecuteNonQuery();
                    OracleDataAdapter da = new OracleDataAdapter(objCmd);
                    da.Fill(fetchedData);


                //}
                    if (outRefCursor != null)
                    {
                        outRefCursor = null;
                    }

            if (objCmd != null)
                    {
                        objCmd.Parameters.Clear();
                        objCmd.Dispose();
                        objCmd = null;
                    }
                    if (da != null)
                    {
                        da.Dispose();
                        da = null;
                    }    
                    if (objConnETDM != null)
                    {
                        if (objConnETDM.State != ConnectionState.Closed)
                            objConnETDM.Close();
                        objConnETDM.Dispose();
                        objConnETDM = null;
                    }


                return fetchedData.Tables[0];
            //}

        }

Я не знаю точно, что такое количество открытых курсоров в базе данных, когда происходит эта ошибка, потому что у меня нет доступа к этим системным таблицам для запроса количества открытых курсоров, но примерно, когда я "обрабатываю" около 75 записей, тогда я получаю это

Ошибка ORA-0100.

Ранее я использовал предложение USING, а теперь прокомментировал его, но без разницы. Я избавился от команды, соединения, адаптера данных и других объектов, но без разницы. Я пытался добавить "Pooling=False" в моей строке подключения, но это сделало вещи еще медленнее, и я получил другую ошибку прослушивателя TNS, после "обработки" только около "25" записей.

Здесь нет Close() метод доступен на объекте OracleParameter. Как курсор может быть закрыт в C#? Можно ли закрыть курсор в самой хранимой процедуре, не влияя на выборку данных?

0 ответов

Другие вопросы по тегам