[Resolvido]Esta Salvando Duas Vezes com esta Stored Procedure no PostgreSQL?

Ola pessoal, tenho uma stored procedure no postgreSQL para o Salvamento dos meus Usuarios, mais quando mando salvar esta duplicando, ou seja, salvando Duas Vezes, onde e que eu Errrrrreiiiiiiiii ?

CREATE OR REPLACE FUNCTION sp_usuarios(integer, integer, character varying, character varying, character varying, integer, date, character varying)
  RETURNS void AS
$BODY$DECLARE 
	TIPO 			integer := $1;
	param_cod_nivel		integer;
	param_dtcadastro  	date 	:= current_date;
	param_dtalteracao 	date 	:= current_date;
BEGIN

	-- Numerando os Parametros:
	
	-- 1 = Tipo de Operacao 1 = Inclusao, 2 = Alteracao.
	-- 2 = Codigo do Usuario, Utilizado para Alteracao dos Dados.
	-- 3 = Nome do Usuario.
	-- 4 = Login do Usuario.
	-- 5 = Senha do Usuario.
	-- 6 = Ativo/ Inativo 0 = Ativo, 1 = Inativo.
	-- 7 = Data que Expira o Acesso.
	-- 8 = Nivel de Usuario.
	
	-- Pegando o Nivel de Usuarios.
	SELECT * FROM us_niveis
		WHERE(us_niveis.niv_descricao = $8) INTO param_cod_nivel;

	-- Inserindo Novos Dados Cadastrais.
	IF TIPO = 1 THEN

		INSERT INTO us_usuarios(usu_nome, usu_login, usu_senha, usu_ativo, usu_dtexpira, usu_cod_nivel, usu_dtcadastro)
			VALUES( $3, $4, $5, $6, $7, param_cod_nivel, param_dtcadastro );
	RETURN;

	END IF;

	-- Alterando os Dados Cadastrais.
	IF TIPO = 2 THEN

		UPDATE us_usuarios SET usu_nome = $3, usu_login = $4, usu_senha = $5, usu_ativo = $6, usu_dtexpira = $7, 
				       usu_cod_nivel = param_cod_nivel, usu_dtalteracao = param_dtalteracao
			WHERE usu_codigo = $2;
	RETURN;
	
	END IF;	


END;$BODY$
  LANGUAGE plpgsql

Na hora de salvar salvo Assim :

public void SalvarUs(int Operacao, int Codigo, String nome, String login, String senha, int Ativo, Date Expira, String Nivel) throws SQLException{
    
        try{
        
            Connection c = getConnection();
        
            CallableStatement stmt;
        
            // Parametros :
            // 1 = Tipo da Operacao: 1 - Incluir, 2 - Alterar.
            // 2 = Codigo do Usuario
            // 3 = Nome
            // 4 = Login.
            // 5 = Senha.
            // 6 = Ativo / Inativo.
            // 7 = Data Expira.
            // 8 = Nivel de Usuario.
        
            stmt = c.prepareCall("{call sp_usuarios(?,?,?,?,?,?,?,?)}");
            stmt.setInt     (1, Operacao);
            stmt.setInt     (2, Codigo);
            stmt.setString  (3, nome);
            stmt.setString  (4, login);
            stmt.setString  (5, senha);
            stmt.setInt     (6, Ativo);
            stmt.setDate    (7, Expira);
            stmt.setString  (8, Nivel);
            
            stmt.execute(); 
            stmt.getConnection().commit();
            
            if(stmt.execute()){
                JOptionPane.showMessageDialog(null, "Operacao de Inclusao Efetuada com Sucesso !");
  
            stmt.close();
         }
        }catch (Exception Erro){
            JOptionPane.showMessageDialog(null, "Houve Erro ao Salvar os Dados Cadastrais do(a) Usuario(a)" + Erro);
            
        }

Seu problema está em chamar o stmt.execute() duas vezes. uma na linha 29 e outra na 32. Entendi que você quer o retorno desse método para confirmar se a transação deu certo, mas então você pode fazer assim: elimina a linha 29 e move a linha 30 para dentro do if(stmt.execute(), antes da mensagem de confirmação por exemplo…

Faz assim:

boolean b = stmt.execute(); stmt.close(); c.commit(); if(b) { JOptionPane.showMessageDialog(null, "Operacao de Inclusao Efetuada com Sucesso !"); }