Назовите Хранимую процедуру Oracle Используя createNativeQuery

Я должен назвать хранимую процедуру с помощью JPA и нашел эту статью:

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

который объясняет, как использовать EntityManager.createNativeQuery. Однако пример на самом деле вызывает функцию, которая имеет возвращаемый аргумент. Я попытался искать пример вызова хранимой процедуры, которая не имеет возврата, но не смогла найти что-либо.

Я могу использовать createNativeQuery для вызова процедуры? Или процедура должна быть изменена, чтобы быть функцией (возможно, возвращает успех/результат отказа)?

Спасибо!

7
задан skaffman 5 July 2010 в 15:59
поделиться

3 ответа

Из JPA wiki:

1.4 Хранимые процедуры

JPA не имеет прямой поддержки хранимых процедур. Некоторые типы хранимых процедур могут быть выполнены в JPA с помощью нативных запросов. Родные запросы в JPA позволяют выполнять любой SQL, который не возвращает ничего или возвращает набор результатов базы данных. Синтаксис для выполнения хранимой процедуры зависит от базы данных. JPA не поддерживает хранимые процедуры, использующие параметры OUTPUT или INOUT. Некоторые базы данных, такие как DB2, Sybase и SQL Server, позволяют хранимым процедурам возвращать наборы результатов. Oracle не позволяет возвращать наборы результатов, только параметры OUTPUT, но определяет тип CURSOR, который может быть возвращен в качестве параметра OUTPUT. Oracle также поддерживает хранимые функции, которые могут возвращать одно значение. Хранимая функция обычно может быть выполнена с помощью собственного SQL-запроса путем выбора значения функции из таблицы Oracle DUAL.

Некоторые провайдеры JPA имеют расширенную поддержку хранимых процедур, некоторые также поддерживают переопределение любой операции CRUD для сущности с помощью хранимой процедуры или пользовательского SQL. Некоторые провайдеры JPA поддерживают параметры CURSOR OUTPUT.

Пример выполнения хранимой процедуры на Oracle

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

Итак, мои советы:

  • проведите несколько экспериментов (т.е. попробуйте)
  • при необходимости (и если возможно) измените хранимую процедуру
  • рассмотрите расширения для конкретного провайдера (в крайнем случае)
12
ответ дан 6 December 2019 в 15:18
поделиться

Если это возможно, вам, вероятно, придется обернуть вызов процедуры таким образом:

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

Получение возвращаемых значений обратно может быть проблематичным с процедурами. Передача их внутрь должна быть простой.

1
ответ дан 6 December 2019 в 15:18
поделиться

Как уже говорилось, спецификация JPA пока не поддерживает StoredProcedures, однако провайдер EclipseLink JPA поддерживает:

http://wiki. eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Extensions_for_Stored_Procedure_Query

1
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: