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:
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.
Publicar un comentario