2009-07-01 1 views
4

У меня есть функция PL/SQL в базе данных Oracle, которую я не могу изменить. Эта функция принимает параметр, который идентифицирует объект, создает копию этого объекта и затем возвращает идентификатор копии. Это выглядит какПолучение возвращаемого значения функции PL/SQL через Hibernate

FUNCTION copy_entity (ид ЧИСЛА) RETURN NUMBER

Мне нужно вызвать эту функцию из спящего режима. Я попытался создать именованный SQL запрос с чем-то подобным

ВЫЗОВА copy_entity (: ид)

как запрос, но от этого я не могу показаться, чтобы получить возвращаемое значение функции. «Возвратный скаляр» Hibernate и аналогичные параметры требуют возврата имени столбца, и у меня нет имени столбца. Это привело меня к

ВЫБРАТЬ copy_entity (: идентификатор) AS newEntityId

с «возвращением скалярными» с использованием newEntityId в качестве имени столбца, но это также не работает, так как Oracle бросает исключение, которое я не могу назвать INSERT (сохранить копию) в SELECT.

Есть ли способ получить возвращаемое значение такой функции PL/SQL? Функция на самом деле намного сложнее и по-прежнему требуется в других частях приложения, поэтому перезапись на самом деле не является вариантом.

+0

Не «SELECT copy_entity (id) как rtnID из DUAL« работает »? – dpbradley

+0

Нет, это приводит к исключению ORA-14551, поскольку ему не разрешено вставлять или обновлять с помощью SELECT. –

ответ

1

Я надеюсь/думаю, что вы можете использовать/SQL блок анонимного PL:

начинают : myresult = copy_entity (: идентификатор); конец;

Теперь у вас есть 'column name' myresult с результатом.

Я никогда не использовал спящий режим, поэтому надеюсь, что он сработает. Я не знаю, насколько гибкий Hibernate.

+1

Я думаю, что ты на правильном пути. В чистом JDBC у вас есть параметр out для вызываемого оператора с? для сохранения возвращаемого значения. Спящий режим должен позволить что-то подобное. –

1

Я думаю, что вы застряли, используя прямой JDBC. Документация Hibernate имеет это в разделе Ограничения для Oracle:

Для Oracle применяются следующие правила:

Функция должна возвращать набор результатов. Первым параметром процедуры должен быть OUT, который возвращает результат . Это делается с использованием типа SYS_REFCURSOR в Oracle 9 или 10. В Oracle вам необходимо определить тип CURSOR REF . См. Литературу Oracle для .

Поскольку эта функция принимает число и возвращает номер, который вы не повезло с Hibernate и, вероятно, будет лучше сделать простой JDBC CallableStatement.