Превышены максимальные открытые курсоры 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#? Можно ли закрыть курсор в самой хранимой процедуре, не влияя на выборку данных?