Início > Programação > Mapeamento de Stored Functions do Oracle em Java

Mapeamento de Stored Functions do Oracle em Java

Um stored function é um conjunto de declarações PL/SQL referenciado por um nome. Funções são muito similares à procedures exceto pelo fato de que as funções retornam valor para o ambiente em que são chamadas. Também é possível retornar valores com procedures, mas esse é um assunto para outro artigo. Quando você cria uma função, você pode definir parâmetros. Há três tipos de parâmetros que podem ser declarados:

IN: o parâmetro pode ser referenciado pela função, mas não pode ser sobrescrito.

OUT: o parâmetro não pode ser referenciado pela função, mas pode ser sobrescrito.

IN OUT: o parâmetro pode ser referenciado e sobrescrito pela funcão.

Vamos criar uma função que retorna a idade de uma pessoa armazenada em banco dado seu identificador.

1. Crie uma tabela para armazenar os dados das pessoas:

CREATE TABLE TBL_PESSOA
(
  PK     NUMBER(3) NOT NULL,
  NOME   VARCHAR2(64) NOT NULL,
  IDADE  NUMBER(2) NOT NULL
);

2. Vamos inserir um registro para poder validar a função:

INSERT INTO TBL_PESSOA
VALUES (1,'JOSÉ', 30);

3. Defina a função. Note o parâmetro de entrada e o retorno bem explícitos:

CREATE OR REPLACE FUNCTION FUNCTION_BUSCAR_IDADE_USUARIO(P_IN_ID IN NUMBER)
RETURN NUMBER
IS
P_IDADE NUMBER;
BEGIN
   SELECT TP.IDADE
   INTO P_IDADE
   FROM TBL_PESSOA TP
   WHERE TP.PK = P_IN_ID;
   RETURN (P_IDADE);
END FUNCTION_BUSCAR_IDADE_USUARIO;

4. Vamos definir a classe Pessoa. Como não estamos trabalhando com ORM, não é necessário anotações da JPA. Basta um POJO:

public class Pessoa {
   private Integer id;
   private String nome;
   private Integer idade;
   // getters e setters
   public Pessoa(Integer id, Integer idade, String nome) {
      this.id = id;
      this.idade = idade;
      this.nome = nome;
   }
}

5. Vamos utilizar a interface Work do Hibernate para ter acesso à Connection:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import org.hibernate.Session;
import org.hibernate.jdbc.Work;

public class Function {
   private Integer idade;
   private Session session;

   public Function(Session session) {
      this.session = session;
   }

   public Integer getIdade() {
      return idade;
   }

   public void execute(final Integer idPessoa) {
      session.doWork(new Work() {
	@Override
        public void execute(Connection con) throws SQLException {
           CallableStatement callStm = null;
           try {
              callStm = 
                 con.prepareCall("{ ? = call FUNCTION_BUSCAR_IDADE_USUARIO(?)}");
              callStm.registerOutParameter(1, Types.INTEGER);
              callStm.setObject(2, idPessoa, Types.INTEGER);
              callStm.execute();
              idade = callStm.getInt(1);
           } finally {
              if (callStm != null) {
                 callStm.close();
              }
           }
        }
      });
   }
}

6. Por fim, crie um método no seu DAO para acessar a função:

@Stateless
public class PessoaDao
{
   @PersistenceContext(unitName = "pu")
   private EntityManager em;

   private Session getSession(){
      return (Session) em.getDelegate();
   }

   public Integer buscarIdade(final Integer idPessoa) {
      Function function = new Function(getSession());
      function.execute(idPessoa);
      return function.getIdade();
   }
}

Referências

1. [https://docs.oracle.com/cd/B28359_01/appdev.111/b28843/tdddg_procedures.htm]
2. [https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm]
3. [https://justonedeveloper.wordpress.com/2013/05/29/convert-hibernate-session-to-jdbc-connection/]
4. [http://www.javamadesoeasy.com/2015/07/jdbc-calling-oracle-database-function.html]
5. [https://docs.oracle.com/cd/F49540_01/DOC/java.815/a64686/04_call5.htm]
6. [https://www.techonthenet.com/oracle/functions.php]

Anúncios
  1. Nenhum comentário ainda.
  1. 09/10/2016 às 8:52 AM

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: