Как мне получить доступ к параметру out в pl / sql proc через hibernate - PullRequest
1 голос
/ 10 сентября 2010

У меня есть процедура pl / sql со следующей подписью

PROCEDURE pr_log_process_started (
p_process_id IN log_process_status.process_id%TYPE, 
p_run_id IN OUT log_process_status.run_id%TYPE);

Как мне сделать вызов этого процесса через Hibernate и получить доступ к значению второго параметра после вызова?

1 Ответ

1 голос
/ 10 сентября 2010

Как я могу сделать вызов этого процесса через Hibernate и получить доступ к значению второго параметра после вызова?

Не думаю, что вы можете.По крайней мере, я не понимаю Глава 16. Собственный SQL официальной документации:

16.2.2.Использование хранимых процедур для запросов

Hibernate3 обеспечивает поддержку запросов с помощью хранимых процедур и функций.Большая часть следующей документации эквивалентна для обоих.Хранимая процедура / функция должна возвращать набор результатов как первый выходной параметр, чтобы иметь возможность работать с Hibernate.Ниже приведен пример такой хранимой функции в Oracle 9 и выше:

CREATE OR REPLACE FUNCTION selectAllEmployments
    RETURN SYS_REFCURSOR
AS
    st_cursor SYS_REFCURSOR;
BEGIN
    OPEN st_cursor FOR
 SELECT EMPLOYEE, EMPLOYER,
 STARTDATE, ENDDATE,
 REGIONCODE, EID, VALUE, CURRENCY
 FROM EMPLOYMENT;
      RETURN  st_cursor;
 END;

Чтобы использовать этот запрос в Hibernate, необходимо сопоставить его с помощью именованного запроса.

<sql-query name="selectAllEmployees_SP" callable="true">
    <return alias="emp" class="Employment">
        <return-property name="employee" column="EMPLOYEE"/>
        <return-property name="employer" column="EMPLOYER"/>
        <return-property name="startDate" column="STARTDATE"/>
        <return-property name="endDate" column="ENDDATE"/>
        <return-property name="regionCode" column="REGIONCODE"/>
        <return-property name="id" column="EID"/>
        <return-property name="salary">
            <return-column name="VALUE"/>
            <return-column name="CURRENCY"/>
        </return-property>
    </return>
    { ? = call selectAllEmployments() }
</sql-query>

Хранимые процедуры в настоящее время возвращают только скаляры и сущности.<return-join> и <load-collection> не поддерживаются.

16.2.2.1.Правила / ограничения для использования хранимых процедур

Вы не можете использовать хранимые процедуры в Hibernate, если не будете следовать некоторым правилам процедур / функций.Если они не следуют этим правилам, их нельзя использовать в Hibernate.Если вы все еще хотите использовать эти процедуры, вы должны выполнить их с помощью session.connection().Правила различны для каждой базы данных, поскольку поставщики баз данных имеют разную семантику / синтаксис хранимых процедур.

Запросы на хранимые процедуры нельзя разбивать на страницы с помощью setFirstResult() / setMaxResults().

Рекомендуемая форма вызовастандарт SQL92: { ? = call functionName(<parameters>) } или { ? = call procedureName(<parameters>}.Собственный синтаксис вызова не поддерживается.

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

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

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

  • Процедура должна возвращать набор результатов.Обратите внимание, что, поскольку эти серверы могут возвращать несколько наборов результатов и количество обновлений, Hibernate будет повторять результаты и принимать первый результат, являющийся набором результатов, в качестве возвращаемого значения.Все остальное будет отброшено.

  • Если вы можете включить SET NOCOUNT ON в вашей процедуре, это, вероятно, будет более эффективным, но это не является обязательным требованием.

Чтобы подвести итог, либо следуйте правилам, либо используйте raw JDBC через session.connection().

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