Невозможно выполнить удаленную хранимую процедуру в MS SQL Server 2008 из Hibernate - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь вызвать процедуру удаленного хранилища, используя Hibernate.Удаленный sql-сервер - MS SQL Server 2000, а исходный сервер, с которого я вызываю процедуру, - MS SQL Server 2008. При попытке вызвать хранимую процедуру я получаю следующее сообщение об ошибке:

[2/29/12 16:44:57:971 MST] 00000016 SystemOut O 2012-02-29 16:44:57,971 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 7213, SQLState: S0001
[2/29/12 16:44:57:971 MST] 00000016 SystemOut O 2012-02-29 16:44:57,971 ERROR [org.hibernate.util.JDBCExceptionReporter] - The attempt by the provider to pass remote stored procedure parameters to remote server 'EDM-SNEC-DBA3' failed. Verify that the number of parameters, the order, and the values passed are correct.
[2/29/12 16:44:57:971 MST] 00000016 SystemOut O 2012-02-29 16:44:57,971 INFO [ca.ab.gov.acys.c3p.publicweb.controller.ChildParticipationEdit] - Caught exception while executing 
SQLQuery: org.hibernate.exception.SQLGrammarException: could not execute query
SQLQuery sqlQuery = this.hibernateSession.createSQLQuery(" { call [dbo].[dc_C3P_get_child_id] " + "(:surname, :firstname, :birth_dt, :facility_id, :effective_dt, :child_id) }");`

Я передаю все необходимые параметры хранимой процедуре, которая выглядит следующим образом:

CREATE  PROCEDURE dbo.dc_C3P_get_child_id
(
    @surname       char(25),
    @firstname     char(20),
    @birth_dt      datetime,
    @facility_id   numeric(8),
    @effective_dt  datetime,
    @child_id      numeric(8)  OUTPUT
)

Любая помощь будет высоко оценена.

Заранее спасибо.

1 Ответ

0 голосов
/ 02 марта 2012

Хорошо, поскольку в хранимой процедуре есть параметр Out, запомните эти правила для Hibernate.

  1. Только первый параметр хранимой процедуры может быть параметром OUT.
  2. Вы не можете иметь более одного параметра OUT, и это должен быть первый параметр.
  3. Существует два способа сопоставить ваши объекты Java с результатами хранимой процедуры. Один из них - это когда вы отображаете файл XML один за другим. другой - если возвращаемый результат имеет ту же структуру таблицы, то вы можете использовать объект Java, который сопоставлен с этой таблицей.

Также с сайта Hibernate

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

Запросы к хранимым процедурам не могут быть разбиты на страницы setFirstResult () / setMaxResults ().

Рекомендованная форма вызова - это стандарт SQL92: {? = звонок functionName ()} или {? = звонок имя_процесса (}. Собственный синтаксис вызова не поддерживается.

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

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

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

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

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

Так что вы можете попытаться получить соединение JDBC из Hibernate, используя session.connection, а затем написать простую вызываемую инструкцию JDBC для достижения вашей цели

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