存储过程Postgres和Java

存储过程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 :=

我正试图从我的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 := (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