Невозможно понять исключение SQL - код ошибки Ora: ORA-01000: - PullRequest
0 голосов
/ 11 июля 2019

У меня есть класс Java, который вызывает процедуру SQL для выполнения некоторых операций с БД.Вот мой метод Java:

    public static void buildContent(String id) throws Exception{
    Connection conn = ExtractDB.getConnection();
    CallableStatement cs = null;
    log.debug("arguments for the procedure is=  "+id);
    try {
        cs = conn.prepareCall("{call CMS.relix.build_rp_data(?)}");
        cs.setString(1, id);
        cs.execute();
        if(cs!=null)
        {
            cs.close();
        }
    } catch (SQLException e) {
        log.error("Exception while executing the procedure", e);                
    }
    finally{
        if(cs!=null)
        {
            cs.close();
        }
    }
}   

После нескольких обработок, он печатает ниже ошибку в журнале и зависает там (я должен завершить процесс вручную, чтобы остановить выполнение):

Ora Err Msg :-1000
Ora Err Code :ORA-01000: maximum open cursors exceeded
ORA-01000: maximum open cursors exceeded
ORA-06512: at "CMS.relix", line 1700
ORA-06512: at line 1
    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208) ...

Я попробовал следующее решение:

После добавления « throw » в блок catch процесс теперь не зависает и продолжает выполнение после печати той же ошибки SQL.

  catch (SQLException e) {
                log.error("Exception while executing the procedure", e);    
                throw e;
            }

Я хочу, чтобы ваша помощь поняла следующие пункты:

  1. как добавить «throw e» в код, позволить программе продолжить работу даже после ошибки?
  2. как обработать эту ошибку / исключение, чтобы остановить обработку и выйти из программы, если возникла такая ситуация.

1 Ответ

2 голосов
/ 11 июля 2019

Вы не закрыли соединение, используйте попытку с блоком ресурсов

log.debug("arguments for the procedure is=  "+id);
try (Connection conn = ExtractDB.getConnection();
CallableStatement cs = conn.prepareCall("{call CMS.relix.build_rp_data(?)}")) {

и удалите finally блок

...