Pedido de exemplo p/ executar function do banco de dados via comandos java e jdbc

Boa tarde gente.
Tenho essa function funcSalvarEndereco que crieu em postgreeSQL.

Queria saber se algum de vocês poderiam me enviar um exemplo que vocês tenham usando java, para execução de function com passagem de parametros de entrada e retorno de saida da function usando conexao JDBC e java.

CREATE OR REPLACE FUNCTION funcSalvarEndereco(in_sTipoGravacao character varying(1), 											  
											  in_idendereco integer,
											  in_idusuario integer,
											  in_sidentend character varying(55),
											  in_snomedest character varying(110),
											  in_scep character varying(10),
											  in_sendereco character varying(100),
											  in_snumero character varying(8),
											  in_scomplemento character varying(100),
											  in_spontoreferencia character varying(60),
											  in_scidade character varying(50),
											  in_sbairro character varying(50),
											  in_sidestado character varying(3),
											  in_spais character varying(50),
											  in_fendprincipal boolean) 
RETURNS character varying(100) AS $$
DECLARE decl_qtd integer;

BEGIN	 		
	
	if (in_sTipoGravacao = 'i') then
	  /*verifica se descrição de identificação de endereço digitafa já existe p/  impedir duplicar do registro*/	  
        decl_qtd = 0;
		SELECT COUNT(*) INTO decl_qtd         		
	  	FROM endereco 		 					
	  	WHERE idusuario = in_idusuario
	  	AND sidentend = TRIM(in_sidentend);

	  	if (decl_qtd > 0) then 				   		  
			return CONCAT('Essa descrição de identificação de Endereço	(',in_sidentend,') já existe. Favor! Digite outra'); 
			 
	  	end if;			
				
	else /*esta editando*/
	   /*verifica se identificação do endereço editata ja 
	     existe para outro registro diferente do atual*/
	
		decl_qtd = 0;
		SELECT COUNT(*) INTO decl_qtd         		
		FROM endereco 		 					
		WHERE idusuario = in_idusuario
		AND sidentend = TRIM(in_sidentend)
		AND idendereco <> in_idendereco;

		if (decl_qtd > 0) then 				   		  
			return CONCAT('Essa descrição de identificação de Endereço	(',in_sidentend,') já existe. Favor! Digite outra'); 
		end if;			
						
  	end if;
 

	/*se registro atual foi cadastrado como endereço principal									  							      		 		      		    		    	 		    	 
	seta todos os endereços existentes false, sem endereço principal.
	para deixar livre inserção de um unico registro como principal */
	if in_fendprincipal = true then
		UPDATE endereco SET
			fendprincipal = false
	    WHERE idusuario = in_idusuario;
	else
		/*se registro atual nao foi cadastrado como endereço principal entao
		 se nao tem nenhum registro cadastrado como principal, 
		 o primeiro registro que entra, entra como principal*/				
		decl_qtd = 0;
		SELECT COUNT(*) INTO decl_qtd 
		FROM endereco  
		WHERE idusuario = in_idusuario
		AND fendprincipal = true;		
				
		if not(decl_qtd > 0) then
		  in_fendprincipal := true;
		end if;
		
	end if;
	
	if (in_sTipoGravacao = 'i') then /*esta inserindo*/
	
		INSERT INTO endereco 
		(idusuario,sidentend,snomedest,scep,sendereco,snumero,scomplemento,spontoreferencia,scidade,
			sbairro,sidestado,spais,fendprincipal,dcadastro)		 
		VALUES(			 														 
		in_idusuario,in_sidentend,in_snomedest,in_scep,in_sendereco,in_snumero,in_scomplemento,in_spontoreferencia,in_scidade,
			in_sbairro,in_sidestado,in_spais,in_fendprincipal,CURRENT_DATE);

	else /*esta editando*/
		update endereco set 						
		sidentend 	 		= in_sidentend,			
		snomedest 	   		= in_snomedest,
		scep 		  		= in_scep,
		sendereco 	    	= in_sendereco,
		snumero 			= in_snumero,
		scomplemento		= in_scomplemento,
		spontoreferencia	= in_spontoreferencia,
		scidade          	= in_scidade,
		sbairro          	= in_sbairro,
		sidestado         	= in_sidestado,
        spais            	= in_spais,
		fendprincipal    	= in_fendprincipal,
		dcadastro 	   		= CURRENT_DATE						
        WHERE (idendereco = in_idendereco AND idusuario  = in_idusuario);
	
	end if;
  
 RETURN 'sucesso';
END;
$$ LANGUAGE plpgsql;

para executar a procedure diretamente pelo postgree eu executo como abaixo,
mais não sei fazer isso passar os paramentros de entrada da função, executar a função e receber o valor do return da saida da função via comandos feitos em uma classe java

select funcSalvarEndereco (
			'e',
			10,
			70,
			'Casa Principal de Tia Basoca',
			'Basoca Ferreira da Hora',
			'66208-000',
			'Rua nova',
			'10',
			'',
			'Póximo a Oficina de Maluquete',
			'São Paulo',
			'Boa Esperança',
			'MA',
			'Brasil',
			true	)

Em princípio é só você fazer um PreparedStatement mais ou menos assim:

PreparedStatement stmt = meuObjetoConnection.prepareStatement("SELECT funcSalvarEndereco( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");

int param = 0;
stmt.setInteger(++param, idEndereco);
stmt.setInteger(++param, idUsuario);
stmt.setString(++param, idEntend);
stmt.setString(++param, nomeDest);
stmt.setString(++param, cep);
stmt.setString(++param, endereco);
stmt.setString(++param, numero);
stmt.setString(++param, complemento);
stmt.setString(++param, pontoReferencia);
stmt.setString(++param, cidade);
stmt.setString(++param, bairro);
stmt.setString(++param, idEstado);
stmt.setString(++param, pais);
stmt.setBoolean(++param, endPrincipal);

ResultSet rs = stmt.executeQuery();
if (rs.next()) {
    String resultado = rs.getString(0);
    System.out.println("Resultado da função: " + resultado);
} else {
    System.out.println("Função não retornou nada");
}
2 curtidas

Boa tarde @staroski. Isso mesmo que eu precisava, acredito que com o código que vc enviou ja da pra solucionar meu problema. Muito obrigado pela ajuda. Abraços

1 curtida