Oracle - Error ORA-01000: numero maximo de cursores abiertos excedido

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 48 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

Error ORA-01000: numero maximo de cursores abiertos excedido

Publicado por Jesus (1 intervención) el 13/01/2020 18:01:45
Buenas tardes, tengo un método en C++ donde estoy usando OCCI (Oracle C++ Call Interface) al que se le hacen varias llamadas desde un servicio TUXEDO, y despues de varias llamadas al método me salta el error ORA 01000 - numero maximo de cursores abiertos excedido, cuando en el metodo estoy cerrando los ResultSet y los Statements. Pongo código de método:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
TsdConsultaF* TscOrmConsultaF::getNuConsultasDetRes(const TsdConsultaF& oEstCons){
 
   string      sSQL="";
   Statement*  stmt=NULL;
   ResultSet*  rs=NULL;
 
   TsdConsultaF *pEstCons=null;
 
   try   {
 
      // ---------------------------------------------
      // Componer la sentencia SQL
      // ---------------------------------------------
      sSQL=(string) "SELECT COUNT(*) FROM TSI_CONSULTAF ";
      sSQL+=" WHERE CO_ENT_CONSULTA = :1 AND FH_INI_CONSULTA BETWEEN TO_DATE(:2,'yyyymmdd') AND TO_DATE(:3,'yyyymmdd') ";
      sSQL+=" AND TIPO_CONSULTA = :4 ";
 
      if (oEstCons.getGrupo() != "Todos")
         sSQL+=" AND CO_GRUPO = :5";
 
      log().debug("[orm] SQL: [%s]",sSQL.c_str());
 
      stmt=db().createStatement(sSQL);
      stmt->setString(1,oEstCons.getEntidad());
      stmt->setString(2,oEstCons.getFechaInicio().format(FwDate::YYYYMMDD,false));
      stmt->setString(3,oEstCons.getFechaFinal().format(FwDate::YYYYMMDD,false));
      stmt->setString(4,oEstCons.getTipoConsulta());
 
      if (oEstCons.getGrupo() != "Todos")
         stmt->setString(5,oEstCons.getGrupo());
 
      rs=stmt->executeQuery();
 
      // ---------------------------------------------
      // Volcar los datos
      // ---------------------------------------------
      if(rs->next()==ResultSet::DATA_AVAILABLE){
 
        pEstCons = new TsdConsultaF();
 
        pEstCons->setNuConsultas(rs->getInt(1));
        //pEstCons->setNuConsultasTirea(rs->getInt(2));
        //pEstCons->setNuConsultasFondo(rs->getInt(3));
      }
 
      // ---------------------------------------------
      // Close resources
      // ---------------------------------------------
      stmt->closeResultSet(rs);
      db().terminateStatement(stmt);
 
      return pEstCons;
 
   }catch(SQLException& e){
 
      log().error("[orm] Error recuperando de TSI_CONSULTAF");
      log().error("[orm] %s",e.getMessage().c_str());
      oEstCons.toLog(log());
      if (rs) stmt->closeResultSet(rs);
      if (stmt) db().terminateStatement(stmt);
      throw FwException("Error recuperando de TSI_CONSULTAF.","TscOrmConsultaF::getNuConsultasdetRes",99);
      return null;
   }
 
}

Sabéis a que puede ser debido el error ORA-01000??? No logro dar con la solución, no deja de saltarme el error.

Saludos
Jesús
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Error ORA-01000: numero maximo de cursores abiertos excedido

Publicado por Rafael (328 intervenciones) el 15/01/2020 11:02:56
Hola:

Primero por SQL/PLUS o similar ejecuta lo siguiente:
1
show parameter open_cursors

Eso te dice el numero maximo de cursores que puedes mantener abiertos....


Ahora durante la ejecucion de tu proceso puedes ver que te esta abriendo que con este query
1
2
3
4
5
6
7
SELECT s.machine, oc.user_name, oc.sql_text, count(1)
FROM v$open_cursor oc, v$session s
WHERE oc.sid = s.sid
and   s.status = 'ACTIVE'
GROUP BY user_name, sql_text, machine
ORDER BY count(1) DESC
;

Y saber si realmente el CURSOR se esta cerrando cuando tu cierras el ResultSET o destruyes el STATEMENT, pero como la conexion sigue viva la consulta continua en ejecucion en la Base de Datos.


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar