Вызов хранимой процедуры Oracle с использованием createNativeQuery - PullRequest
7 голосов
/ 05 июля 2010

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

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

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

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

Спасибо!

Ответы [ 3 ]

12 голосов
/ 05 июля 2010

из вики JPA:

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();

Так что мои советы будут:

  • провести несколько экспериментов (т.е. попробовать)
  • при необходимости (и, если возможно,) изменить хранимую процедуру
  • Рассмотрим специфичные для провайдера расширения (в крайнем случае)
1 голос
/ 05 июля 2010

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

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

1 голос
/ 05 июля 2010

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

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

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

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