Después de de nuestra larga búsqueda de información dimos con la respuesta este enigma que tienen ciertos los lectores. Te compartimos la respuesta y deseamos que sea de mucha apoyo.
Solución:
Teniendo en cuenta el siguiente procedimiento almacenado que simplemente devuelve un valor de retorno básico:
CREATE OR REPLACE PROCEDURE count_comments (
postId IN NUMBER,
commentCount OUT NUMBER )
AS
BEGIN
SELECT COUNT(*) INTO commentCount
FROM post_comment
WHERE post_id = postId;
END;
Puedes llamar a este con JPA estándar:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter(1, Long.class,
ParameterMode.IN)
.registerStoredProcedureParameter(2, Long.class,
ParameterMode.OUT)
.setParameter(1, 1L);
query.execute();
Long commentCount = (Long) query.getOutputParameterValue(2);
Si el procedimiento almacenado devuelve un SYS_REFCURSOR:
CREATE OR REPLACE PROCEDURE post_comments (
postId IN NUMBER,
postComments OUT SYS_REFCURSOR )
AS
BEGIN
OPEN postComments FOR
SELECT *
FROM post_comment
WHERE post_id = postId;
END;
Puedes llamarlo así:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("post_comments")
.registerStoredProcedureParameter(1, Long.class,
ParameterMode.IN)
.registerStoredProcedureParameter(2, Class.class,
ParameterMode.REF_CURSOR)
.setParameter(1, 1L);
query.execute();
List
Si desea llamar a una función de base de datos de Oracle:
CREATE OR REPLACE FUNCTION fn_count_comments (
postId IN NUMBER )
RETURN NUMBER
IS
commentCount NUMBER;
BEGIN
SELECT COUNT(*) INTO commentCount
FROM post_comment
WHERE post_id = postId;
RETURN( commentCount );
END;
no puedes usar el StoredProcedureQuery
ya que no funciona con Hibernate 5, entonces puedes llamarlo así:
BigDecimal commentCount = (BigDecimal) entityManager
.createNativeQuery(
"SELECT fn_count_comments(:postId) FROM DUAL"
)
.setParameter("postId", 1L)
.getSingleResult();
o con JDBC simple:
Session session = entityManager.unwrap( Session.class );
Integer commentCount = session.doReturningWork( connection ->
try (CallableStatement function = connection.prepareCall(
" ? = call fn_count_comments(?) " ))
function.registerOutParameter( 1, Types.INTEGER );
function.setInt( 2, 1 );
function.execute();
return function.getInt( 1 );
);
Para más detalles consulta los siguientes artículos:
- Cómo llamar a funciones y procedimientos almacenados de Oracle con JPA e Hibernate
- Cómo llamar a funciones y procedimientos almacenados de SQL Server con JPA e Hibernate
- Cómo llamar a funciones de PostgreSQL (procedimientos almacenados) con JPA e Hibernate
- Cómo llamar a funciones y procedimientos almacenados de MySQL con JPA e Hibernate
Puedes hacer lo siguiente
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
PreparedStatement st = session.connection().prepareStatement("call procedureName(?, ?)");
st.setString(1, formatter.format(parameter1));
st.setString(2, formatter.format(parameter2));
st.execute();
tx.commit();
Agregue el manejo de excepciones donde sea necesario.
Para ejecutar el procedimiento remoto use esta construcción:
Cartografía
call some_rp(:param1, :param2)
codigo Java
session.getNamedQuery("RP").setInteger("param1", 1).setInteger("param2", 2).executeUpdate();
Si crees que te ha sido de ayuda este artículo, nos gustaría que lo compartas con otros programadores de esta forma contrubuyes a extender nuestra información.