jueves, marzo 29, 2012

ORA-01000: número máximo de cursores abiertos excedido

Este error se debe a que la sesión alcanzó el límite máximo permitido de cursores abiertos.

para solucionar este problema existen una serie de recomendaciones que van desde la manipulación de los parametros de la base de datos Oracle para que soporte mas cursores o la mejora de la aplicacion donde se originó el error.


Puedes obtener el número de cursores permitidos con la siguiente consulta:

SELECT VALUE FROM V$PARAMETER WHERE NAME='open_cursors';

para modificar este valor lo puedes hacer con la siguiente instrucción:


ALTER SYSTEM SET OPEN_CURSORS = 1000;

donde el numero 1000 será el máximo de cursores permitidos.

Hay que tener en cuenta que a pesar de elevar el número máximo de cursores permitidos esto va a depender del Sistema Operativo y del hardware.

Si este error te sucedió al ejecutar un procedimientos o script desde un programa enVisual Studio .NET, entonces hay una serie de mejores que debes tener en cuenta: 

la primera de ellas es hacer Dispose a los objetos que usas al momento ejecutar  la sentencia Oracle, cerrar el componente OracleDataReader.

A continuación dejo una tabla que indica a que objetos se puede hacer dispose y close.


Clase
Método close
Método Dispose
OracleConnection
si
si
OracleDataReader
si
si
OracleBFile
si
si
OracleBlob
si
si
OracleClob
si
si
OracleXmlStream
si
si
OracleCommand

si
OracleDataAdapter

si
OracleRefCursor

si
OracleParameter

si
OracleCommandBuilder

si
OracleTransaction

si
OracleXmlType

si
OracleGlobalization

si

1 comentario:

MAO TENE dijo...

Chevere muy buen aporte, comparto mi caso por si a alguien le pase lo mismo.

Estaba generando unos inserts para una tabla en mi base de datos ORACLE, lo hacia desde java de la siguiente manera:
public void generainsert() throws Exception {

String part1 = "INSERT INTO \"SIAPROVRESP\".\"TDEPRECAMORTIZACIONACTDIF\" (SACTIVODIFERIDOVALORES, SACTIVODIFERIDO, NUMPERIODO, FCALCULO, VALORACUMULADO, VALOR, VALORLIBROS, PROCESADO, ACTIVO, CUSUARIO, FMODIFICACION) VALUES ";
for (Tdeprecamortizacionactdif obj : agregaamortizacion) {
String valora="";
valora=obj.getValoracumulado().toString().replace(".", ",");
String valor="";
valor=obj.getValor().toString().replace(".", ",");
String valorlib="";
valorlib=obj.getValorlibros().toString().replace(".", ",");
try {
String insert = "";
insert = part1 + "('" + obj.getSactivodiferidovalores() + "', '" + obj.getSactivodiferido() + "', '" + obj.getNumperiodo() + "', TO_DATE('" + devolverultimodia(obj.getFcalculo()) + "', 'DD/MM/YYYY')"+",'"+valora+"','"+valor+"','"+valorlib+"','"+obj.getProcesado()+"','"+obj.getActivo()+"','1',SYSDATE)";
System.out.println(insert);
Statement sentencia = conn.getConexion().createStatement();
System.out.println(insert);
sentencia.executeUpdate(insert);

} catch (SQLException ex) {
Logger.getLogger(CtrContratos.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Cuano hacía este procedimiento, insertaba al rededor de 500 registros y luego me daba el error ORA-01000.
La solucion fue tal cual explica el amigo dueño del post. Le agrege la linea para cerrar la sentencia
sentencia.close();
Y SOLUCIONADO.