Превышено максимальное количество курсоров при вызове хранимых процедур пакета - PullRequest
0 голосов
/ 12 марта 2019

У меня есть пакет Oracle, который содержит 3 хранимые процедуры: ini_pkg, add_concept, add_imp, которыми я хочу заполнить некоторые списки, а затем работать с данными, хранящимися в них. Для каждой концепции я вызываю соответствующую процедуру, но после 300 вставок выдается исключение.

@Override
    public boolean save(XX fact) {
        try {
            StoredProcedureQuery query = manager.createStoredProcedureQuery("COM.TEST.INI_PKG");
            query.registerStoredProcedureParameter("UUID", String.class, ParameterMode.IN);
            query.setParameter("UUID", fact.getUuid());
            query.execute();

            if (fact.getConcepts() != null && !fact.getConcepts().isEmpty()) {
                for (Iterator<Concept> iterator = fact.getConcepts().iterator(); iterator.hasNext();) {
                    Concept concept = iterator.next();

                    StoredProcedureQuery addQuery = manager
                            .createStoredProcedureQuery("COM.TEST.ADD_CONCEPT");
                    addQuery.registerStoredProcedureParameter("P_CLAVPROD", String.class, ParameterMode.IN);
                    addQuery.setParameter("P_CLAVPROD", concept.getClaveProdServ());
                    addQuery.execute();

                    if (concept.getImp() != null && !concept.getImp().isEmpty()) {
                        ...
                    }
                }
            }

            ...

            queryInsert.execute();
            manager.close();
        } catch (PersistenceException pe) {
            System.out.println("Error : " + pe.getMessage());
        }
        return true;
    }

Сытые процедуры в упаковке

TYPE R_CONCEPTO IS RECORD (
    CLAVPRODSERV VARCHAR2(20)
    timpuesto T_IMPUESTO
);
TYPE T_CONCEPT IS TABLE OF R_CONCEPT;
tconcept T_CONCEPT;

PROCEDURE INI_PKG(UUID IN VARCHAR2) AS
  BEGIN
    IDFAC := COM.SEQ_IDFACT.NEXTVAL;
    P_UUID := UUID;
    tconcept := t_concept();
  END INI_PKG;

  PROCEDURE ADD_CONCEPT(P_CLAVPROD IN VARCHAR2) AS
  BEGIN
      tconcept.EXTEND; 
      tconcept(tconcept.LAST).CLAVPRODSERV := P_CLAVEPROD;
  END ADD_CONCEPT;

Я не знаю, почему я получаю максимальное количество курсоров превышено (максимум 300). Любые предложения здесь?

1 Ответ

2 голосов
/ 12 марта 2019

Я не эксперт по Java, но убедитесь, что вы закрыли свои курсоры, когда закончите с ними.Oracle имеет максимум одновременных открытых курсоров.Это может быть установлено выше, но это хорошая практика, чтобы закрыть их.Можете ли вы закрыть addQuery в цикле Java после выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...