2010-07-05 29 views
6

Tengo que llamar a un procedimiento almacenado utilizando JPA y encontró este artículo:llamada de Oracle procedimiento almacenado Usando createNativeQuery

http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html

que explica cómo utilizar EntityManager.createNativeQuery. Sin embargo, el ejemplo en realidad llama a una función que tiene un argumento de retorno. Intenté buscar un ejemplo de invocación de un procedimiento almacenado que no tiene devolución, pero no he podido encontrar nada.

¿Puedo usar createNativeQuery para llamar a un procedimiento? ¿O es necesario modificar el procedimiento para que sea una función (quizás devuelva un resultado de éxito/fracaso)?

Gracias!

Respuesta

11

Desde el wiki JPA:

1.4 Stored Procedures

APP no tiene ningún apoyo directo a los procedimientos almacenados. Algunos tipos de procedimientos almacenados se pueden ejecutar en JPA mediante el uso de consultas nativas. Las consultas nativas en JPA permiten cualquier SQL que no devuelva nada, o devuelve un conjunto de resultados de base de datos para ser ejecutado. La sintaxis para ejecutar un procedimiento almacenado depende de la base de datos. JPA no es compatible con procedimientos almacenados que usan parámetros OUTPUT o INOUT. Algunas bases de datos como DB2, Sybase y SQL Server permiten que los procedimientos almacenados devuelvan conjuntos de resultados. Oracle no permite que se devuelvan conjuntos de resultados, solo parámetros de SALIDA, pero define un tipo de CURSOR que se puede devolver como un parámetro de SALIDA. Oracle también admite funciones almacenadas, que pueden devolver un valor único. Una función almacenada normalmente se puede ejecutar utilizando una consulta SQL nativa seleccionando el valor de la función de la tabla Oracle DUAL.

Algunos proveedores de JPA tienen soporte extendido para procedimientos almacenados, algunos también admiten la anulación de cualquier operación CRUD para una entidad con un procedimiento almacenado o SQL personalizado. Algunos proveedores de JPA tienen soporte para los parámetros de CURSOR OUTPUT.

Ejemplo ejecución de un procedimiento almacenado en Oracle

EntityManager em = getEntityManager(); 
Query query = em.createNativeQuery("BEGIN VALIDATE_EMP(P_EMP_ID=>?); END;"); 
query.setParameter(1, empId); 
query.executeUpdate(); 

Así que mis consejos serían:

  • hacer algunas experimentaciones (es decir probarlo)
  • si es necesario (y si es posible) modificar el procedimiento almacenado
  • considerar extensiones específicas del proveedor (como último recurso)
+0

Gracias Pascal para el enlace. No sé cómo me perdí esa página en mi búsqueda. – sdoca

1

Si es posible, es probable que tengas para envolver la llamada al procedimiento de esta manera:

em.createNativeQuery("BEGIN yourprocedure; END;") 

Obtención de valores de retorno de espalda pueden ser problemáticos con los procedimientos. Pasarlos debería ser fácil.

Cuestiones relacionadas