存储过程Postgres和Java
我正试图从我的java应用程序在Postgres中运行一个存储过程,如下所示:存储过程Postgres和Java,java,postgresql,stored-procedures,plpgsql,Java,Postgresql,Stored Procedures,Plpgsql,我正试图从我的java应用程序在Postgres中运行一个存储过程,如下所示: CREATE OR REPLACE FUNCTION geraCodigo() RETURNS integer AS $a$ DECLARE codigo varchar; codigoNovo varchar; maximoRegistros integer; contador integer := 1; quantidadeCaracteres integer; BEGIN maximoRegistros :=
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得到了这些响应
有没有办法只从一个过程中得到最后的响应?当我用单独的BEGIN创建这些嵌套函数调用时。。。例外最后,我使用了不同的函数。在我看来,这至少使代码更易于维护和阅读(以及调试) 一般来说:在代码末尾有一个带有测试的循环。这是一种方法,但始终存在一个问题:如果它没有达到测试或更改测试值的代码行,该怎么办?然后它会永远循环,你会得到你描述的问题。 在代码中有几个ExceptionHandler。在那一点上你什么也不做。但是如果其中一个内部循环抛出异常呢?该值未更新,测试将无法正常执行 使用这种循环,我将始终构建一个安全测试,以防止它永远像这样运行:
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
在您的代码中,我至少看到一个可能导致此问题的循环。这是以以下内容开始的第一个循环:
如果(定量分形)<10,则
. 如果更新引发异常,QuantidaDeCracteres的值将永远不会变大
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