2015-01-26 2 views
0

Я пытаюсь выполнить хранимую процедуру в Postgres из моего приложения Java, это процедура:хранимых процедур Postgres и Java

CREATE OR REPLACE FUNCTION geraCodigo() RETURNS integer AS $a$ 
DECLARE 
codigo varchar; 
codigoNovo varchar; 
maximoRegistros integer; 
contador integer := 1; 
quantidadeCaracteres integer; 
BEGIN 
maximoRegistros := (SELECT count(id) FROM gisTemp); 
RAISE NOTICE 'Contador % ',contador; 
RAISE NOTICE 'maximoRegistros % ',maximoRegistros; 
LOOP 
RAISE NOTICE 'Contador % ',contador; 
IF (SELECT tipoTensao FROM gisTemp WHERE id = contador) = 'MT' THEN 

    /*CHECA DIGITO 5 DO codConsumidor E PROCESSA DE ACORDO COM RESULTADO */ 
    IF (SELECT substring(codConsumidor from 4 for 1) FROM gisTemp WHERE id = contador) = '1' THEN 

     quantidadeCaracteres = (SELECT char_length((SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador))); 
     IF (quantidadeCaracteres) < 10 THEN 
      LOOP 
      BEGIN 
      UPDATE gisTemp SET idsap = concat('0',(SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador)) WHERE id = contador; 
      quantidadeCaracteres := quantidadeCaracteres + 1; 
      EXCEPTION WHEN invalid_text_representation THEN 
      ------ NÃO FAZ NADA 
      END; 
      EXIT WHEN quantidadeCaracteres >= 10; 
      END LOOP; 
     ELSE 
     UPDATE gisTemp SET idsap = (SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador) WHERE id = contador; 
     END IF; 

    ELSIF (SELECT substring(codConsumidor from 4 for 1) FROM gisTemp WHERE id = contador) = '2' THEN 

     quantidadeCaracteres = (SELECT char_length((SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador))); 
     IF (quantidadeCaracteres) < 10 THEN 
      LOOP 
      BEGIN 
      UPDATE gisTemp SET idsap = concat('0',(SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador)) WHERE id = contador; 
      quantidadeCaracteres := quantidadeCaracteres + 1; 
      EXCEPTION WHEN invalid_text_representation THEN 
      ------ NÃO FAZ NADA 
      END; 
      EXIT WHEN quantidadeCaracteres >= 10; 
      END LOOP; 
     ELSE 
     UPDATE gisTemp SET idsap = (SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador) WHERE id = contador; 
     END IF; 

    ELSIF (SELECT substring(codConsumidor from 4 for 1) FROM gisTemp WHERE id = contador) = '0' THEN 
     UPDATE gisTemp 
     SET idsap = concat((SELECT substring(codConsumidor from 0 for 4) FROM gisTemp WHERE id = contador),(SELECT substring(codConsumidor from 6 for 10) FROM gisTemp WHERE id = contador)) 
     WHERE id = contador; 
    END IF; 

ELSIF (SELECT tipoTensao FROM gisTemp WHERE id = contador) = 'BT' THEN 
    /*CHECA codConsumidor, SE > 18900 PEGA SÓ NÚMEROS*/ 
    BEGIN 
    IF (SELECT CAST((SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador) AS integer)) > 18900 THEN 
     /*CHECA O TAMANHO DO IDSAP*/ 
     quantidadeCaracteres = (SELECT char_length((SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador))); 
     IF (quantidadeCaracteres) < 10 THEN 
      /*LOOP PARA ADICIONAR ZEROS A ESQUERDA*/ 
      LOOP 
      BEGIN 
      UPDATE gisTemp SET idsap = concat('0',(SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador)) WHERE id = contador; 
      quantidadeCaracteres := quantidadeCaracteres + 1; 
      EXCEPTION WHEN invalid_text_representation THEN 
      ------ NÃO FAZ NADA 
      END; 
      EXIT WHEN quantidadeCaracteres >= 10; 
      END LOOP; 
     ELSE 
      UPDATE gisTemp SET idsap = (SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador) WHERE id = contador; 
     END IF; 
    /*CHECA codConsumidor, SE <= 18900 PEGA BTE E NÚMEROS*/ 
    ELSIF (SELECT CAST((SELECT substring(codConsumidor from 4 for 10) FROM gisTemp WHERE id = contador) AS integer)) <= 18900 THEN 
     UPDATE gisTemp SET idsap = concat((SELECT substring(codConsumidor from 0 for 4) FROM gisTemp WHERE id = contador),(SELECT substring(codConsumidor from 6 for 10) FROM gisTemp WHERE id = contador)) WHERE id = contador;  
    END IF; 
    EXCEPTION WHEN invalid_text_representation THEN 
    ------ NÃO FAZ NADA 
    END; 

END IF; 
    contador := contador+1; 
EXIT WHEN contador >= maximoRegistros; 
END LOOP; 
RETURN 1; 
END; $a$ LANGUAGE plpgsql; 

Когда я запускаю это в Java, я получаю эту ошибку: Java. lang.OutOfMemoryError: GC предел накладных расходов превысил

public boolean processaGISSAP() { 
    CallableStatement cstmt = null; 
    try { 
     String sql = "{call geracodigo()}"; 
     cstmt = con.prepareCall(sql); 
     cstmt.execute(sql); 
    } catch (SQLException ex) { 
     Logger.getLogger(CircuitDAO.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return true; 
} 

Я думаю, что его, потому что в моей процедуре Theres обновления и выбирает, а Java получает эти ответы.

Есть ли способ получить окончательный ответ от процедуры?

ответ

0

Когда я создаю такие вложенные вызовы функций с отдельными разделами BEGIN ... EXCEPTION .. END, я использую разные функции. Это делает код по крайней мере проще поддерживать и читать (и отлаживать), на мой взгляд.

Вообще говоря: у вас есть цикл с тестом в конце кода. Это метод, но всегда есть одна проблема: что, если он не достигает теста или строки кода, которые изменяют проверенные значения? Затем он зациклится навсегда, и вы получите проблемы, которые вы описываете. В вашем коде у вас есть несколько обработчиков исключений. Вы ничего не делаете в этот момент. Но что, если одна из этих внутренних циклов выдает исключение? Значение не обновляется, и тест не будет работать хорошо.

С такого рода петли я всегда буду строить тест безопасности, чтобы предотвратить его от работы навсегда, как это:

cntLoopMax integer:=10 
cntLoop integer:=0; 

LOOP 
BEGIN 
    ... 
EXCEPTION 
    cntLoop := cntLoop + 1; 
END 
    if cntLoop >= cntLoopMax then 
    raise notice 'exit because of cntLoop exceeds cntLoopMax'; 
    EXIT cntLoop>=cntLoopMax; 
    end if; 
    EXIT ...  
END LOOP 

В своем коде я вижу одну петлю, по крайней мере, что может вызвать эту проблему. Это первый цикл, который начинается с: IF (quantidadeCaracteres) < 10 ТОЕН . Если обновление генерирует исключение, значение quantidadeCaracters никогда не станет больше.

Смежные вопросы