Я пытаюсь выполнить хранимую процедуру в 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 получает эти ответы.
Есть ли способ получить окончательный ответ от процедуры?