Cursores

Tengo una aplicación hecha en v6 contra un oracle 10 g, lo que no me queda claro en el tema de cursores si cada consulta que hace la aplicación se traduce a un cursor en oracle.

1 respuesta

Respuesta
1
Un cursor es un trocito de la memoria que reserva Oracle para procesar el valor de una consulta, si se emplea PL/SQL, si son consultas simples no tienen porque llevar cursores implícitos.
Te aconsejo que uses cursores explícitos siempre, son más rápidos aunque sea para devolver un valor.
Si pero lo que no entiendo, supone que desde visual basic, porque no uso pl/sql , esta el sql embebido en la aplicación, ¿si hago desde vb un select * from clientes se traduce a un cursor en oracle?
No, porque el cursor se debería de declarar para que se use
A lo que voy es que siempre me sale esta advertiencia
Las métricas "Current Open Cursors Count" están en 1211
y nunca abrimos cursores porque no programamos co pl/sql solo ejecutamos consultas desde pl/sql y no se la verdad si tengo que amplicar el parametro open_cursors , o como solucionar este problema.
Gracias de vuelta.
Posiblemente el parámetro open_cursors lo tienes a 1200 y por eso salta, esta cifra es normal ya que una aplicación que gaste más cursores es que esta funcionado malgastando memoria, a menos que sea una muy pesada como Siebel, el parámetro limita el numero de cursores por sesión y por usuario acumulados.
Yo creo que la aplicación esta abriendo cursores pero no los cierra y sobrepasa el umbral como te he comentado antes. Los debería cerrar explícitamente en el código.
Puedes monitorizar los cursores abiertos con:
select count(*) from v$open_cursor
El problema no es reajustar el parámetro de open_cursor pero tienes una sql que te da una idea de que valor debería tomar el parámetro open_cursor e función del uso que se le de, esto esta bien para sistemas con muchos usuario concurrentemente:
select substr(a.sid,1,10) sid,
substr(nvl(b.program,machine),1,30) program,
count(*)
from v$open_cursor a, v$session b
where a.saddr=b.saddr
group by substr(a.sid,1,10),
substr(nvl(b.program,machine),1,30)
order by 3 desc ;
open_cursors=300 es lo que tengo no se porque me sale eso, pero como decís vos un cursor para que se use se tiene que declarar, y como uso vb no declaro nunca el cursor, no se cuantos habrá en total, por eso era mi duda si no estoy usando pl/sql y uso vb, si cada consulta que hago desde la aplicación la transforma en un cursor.
Los confundí con los curosres de Pl/SQL que son análogos, osea, se usan del mismo modo que oracle internamente abre cursores cuando ejecutas las consultas desde VB contra Oracle.
Este enlace es más especifico y te puede aclarar algo el tema:
http://support.microsoft.com/kb/183639/es

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas