Saltar al contenido

Cómo llamar a la función o procedimiento de Oracle usando Hibernate (EntityManager) o JPA

Sé libre de compartir nuestro espacio y códigos en tus redes sociales, ayúdanos a ampliar nuestra comunidad.

Solución:

Se puede llamar a una función de Oracle o un procedimiento almacenado utilizando EntityManager de la siguiente manera.

Para la función de Oracle

Crear una función con sys_refcursor como tipo de retorno

CREATE OR REPLACE FUNCTION my_function
(p_val IN varchar2)
    RETURN SYS_REFCURSOR
  AS
    my_cursor SYS_REFCURSOR;
  BEGIN
    OPEN my_cursor FOR SELECT emp_name FROM employees
    WHERE lower(emp_name) like lower(p_val||'%');
    RETURN my_cursor;    
  END;

En la clase Entidad, defina la función como

@javax.persistence.NamedNativeQuery(name = "getFunc", query = "? =  call
my_function(:empName) ", resultClass = Employee.class, hints = 
@javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") )

Para el procedimiento almacenado de Oracle

Crear procedimiento con sys_refcursor como primer parámetro de SALIDA

CREATE OR REPLACE PROCEDURE myProcedure(p_cursor out sys_refcursor,
     p_val  in varchar2
)
 AS
BEGIN
     OPEN o_cursor FOR
          SELECT     emp_name 
             FROM     employees 
            WHERE     LOWER (emp_name) LIKE lower(p_val||'%');

En la clase Entidad, defina el procedimiento como

@javax.persistence.NamedNativeQuery(name = "getProc", query = " call
my_procedure(?,:empName) ", resultClass = Employee.class, hints = 
@javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") )

y finalmente en la función o procedimiento de llamada de clase DAO como

Query query = entityManager.createNamedQuery("getFunc"); // if procedure then getProc 
query.setParameter("empName","smith"); 
query.getResultList(); 

Gracias

Para su función,

create or replace 
FUNCTION my_function(p_val IN varchar2)
    RETURN SYS_REFCURSOR
  AS
    my_cursor SYS_REFCURSOR;
  BEGIN
    OPEN my_cursor FOR SELECT emp_name FROM employees
    WHERE lower(emp_name) like lower(p_val||'%');
    RETURN my_cursor;    
  END;

Puede definir lo siguiente NamedNativeQuery:

@NamedNativeQuery(
    name = "my_function",
    query = " ? = call my_function( ? ) ",
    callable = true,
    resultClass = String.class
)

Y, puede llamar a la consulta de esta manera:

List employeeNames = entityManager
    .createNamedQuery("my_function")
    .setParameter(1, 1L)
    .getResultList();

Para un procedimiento almacenado:

CREATE OR REPLACE 
PROCEDURE my_procedure(p_val IN VARCHAR2, 
    my_cursor OUT SYS_REFCURSOR,
) 
AS
BEGIN
    OPEN my_cursor FOR
    SELECT emp_name FROM employees
    WHERE lower(emp_name) like lower(p_val||'%');
END;

puede utilizar la siguiente consulta JPA 2.1:

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("my_procedure")
    .registerStoredProcedureParameter(1, String.class, 
         ParameterMode.IN)
    .registerStoredProcedureParameter(2, Class.class, 
         ParameterMode.REF_CURSOR)
    .setParameter(1, 1L);
 
query.execute();
 
List result = query.getResultList();

Para Procedimiento:

CREATE OR REPLACE PROCEDURE my_procedure(p_val IN VARCHAR2, 
  my_cursor OUT SYS_REFCURSOR) 
AS
BEGIN
  OPEN my_cursor FOR SELECT emp_name FROM employees 
      WHERE lower(emp_name) like lower(p_val||'%');
END;

Solución alternativa: procedimiento de llamada con sys_refcursor como parámetro OUT sin definir @NamedNativeQuery

StoredProcedureQuery query = entityManager.createStoredProcedureQuery("myProcedure");
    query.registerStoredProcedureParameter(1, void.class, ParameterMode.REF_CURSOR);
    query.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
    query.setParameter(2, "Umesh");
    List result = query.getResultList();

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *