Я еще нигде не смог найти этого явно заявленного, но множество примеров, которые я нашел в Интернете, следуют тому, что я делал.
У меня есть класс C #, который использует ODP.net для подключения к базе данных Oracle и запуска процедуры, которая находится в пакете.
В моем пакете есть хранимые процедуры, которые принимают выходной параметр курсора ref. Все, что нужно сделать, это открыть курсор для определенного оператора выбора.
Если я выполню эту процедуру непосредственно на базе данных oracle, то в итоге получу сообщение об ошибке максимального числа открытых курсоров.
Итак, мне было интересно, действительно ли ODP.net закрывает этот курсор, который был открыт в моей процедуре?
Я использую метод OracleDataApaper.Fill (DataSet).
например.
DataSet ds = new DataSet();
OracleConnection conn = new OracleConnection(this.connStr);
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn);
OracleDataAdapter adapter = new OracleDataAdapter(com);
conn.Open();
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName";
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output);
com.CommandType = CommandType.StoredProcedure;
adapter.Fill(ds);
conn.Close();
PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS
BEGIN
open outCursor
select
EAEMAL as Email
from
EmailTable
where
EmailName = searchParam;
END GETALLEMAILS;
Я просто боюсь оставлять открытые курсоры на БД - это все. Если кто-нибудь может предоставить ссылки на официальную документацию, это было бы здорово!
Обновление:
Спасибо за ввод. Я звонил
com.Dispose();
conn.Close();
conn.Dispose();
но оставил их вне моего примера.
Я нашел это сообщение на форуме, в котором говорится, что метод OracleDataAdapter.Fill (Dataset) освобождает курсор ref после выполнения метода Fill ().
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html
Хотелось бы, чтобы в документации Oracle было более явное описание этого процесса.