No he podido encontrar esto explícitamente en ninguna parte todavía, pero un montón de ejemplos que he encontrado en línea siguen lo que he estado haciendo.¿ODP.net cierra un cursor de ref cuando se cierra la conexión?
Tengo una clase C# que usa ODP.net para conectarse a un Oracle DB y ejecutar un procedimiento que está en un paquete.
Mi paquete tiene procedimientos almacenados que toman un parámetro de salida del cursor de referencia. Todo lo que hace el procedimiento es abrir el cursor para una instrucción select particular.
Si ejecuto este procedimiento directamente en el oráculo db, entonces eventualmente alcanzaré un número máximo de errores de cursores abiertos.
Entonces, me preguntaba si ODP.net cierra este cursor que se abrió en mi procedimiento.
Estoy usando el método OracleDataApaper.Fill (DataSet).
por ejemplo.
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;
Solo tengo miedo de dejar abiertos los cursores en la base de datos, eso es todo. Si alguien puede proporcionar enlaces a la documentación oficial, ¡sería genial!
actualizaciones:
Gracias por la entrada. Estaba llamando a
com.Dispose();
conn.Close();
conn.Dispose();
pero los dejé fuera de mi ejemplo.
Encontré esta publicación en el foro, que indica que el método OracleDataAdapter.Fill (Dataset) libera el cursor ref después de que se haya ejecutado el método Fill().
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html
deseo la documentación de Oracle fue más explícito en la descripción de este proceso sin embargo.
Agregaría OracleDataReader a la lista de objetos para eliminar, si usa ellos. Parece que ha resuelto nuestro problema de "máximo cursores abiertos". – Fueled