2012-03-01 14 views
1

Hibernateを使用してリモートストアプロシージャを呼び出そうとしています。リモートSQL Serverは、私がプロシージャを呼び出していたところからMS SQL Server 2000およびソースサーバである私は、次のエラーメッセージ取得していますストアドプロシージャを呼び出すしようとすると、MS SQL Server 2008の次のとおりです。Hibernateから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 
) 

何か助けが高く評価されます。

ありがとうございます。

+0

あなたの目的を達成するために、単純なJDBCコール可能文を書くことができ、あなたが呼び出しされる方法のコードスニペットを投稿できますこのストアドプロシージャこのプロシージャを呼び出すには、HibernateでネイティブSQLを使用していますか?プロシージャを呼び出すために必要なすべてのパラメータを渡していますか?ストアドプロシージャの外観と、Hibernateからの呼び出し方法を投稿しないかぎり、難しいです。 – Eosphorus

+0

SQLQuery sqlQuery = this.hibernateSession.createSQLQuery( "{dc_C3P_get_child_id]" + "012c"姓、:FIRSTNAME:birth_dt:facility_id:effective_dt:child_id)} "); 私は次のようであるストアドプロシージャのために必要なすべてののparamsを渡しています:私はすでにこれらのルールを見てきました – Manohar

答えて

0

OkストアドプロシージャにOutパラメータがあるので、これらのHibernateのルールを覚えておいてください。

  1. ストアドプロシージャの最初のパラメータだけがOUTパラメータになります。
  2. 複数のOUTパラメータを持つことはできません。また、最初のパラメータである必要があります。
  3. Javaオブジェクトをストアドプロシージャの結果にマップするには、2つの方法があります。 1つは、XMLファイルを1つずつマップする場所です。もう1つは、戻り結果が表の同じ構造である場合、その表にマップされているJavaオブジェクトを使用できます。あなたには、いくつかの プロシージャ/ファンクションのルールに従わない限り、あなたはHibernateでストアドプロシージャを使用することはできませんHibernateのウェブサイト

    からも

。それらのルールに従わないと、 はHibernateで使用できません。これらの手順を使用したい場合は、 をsession.connection()経由で実行する必要があります。データベースベンダーは異なる ストアドプロシージャセマンティクス/構文を持っているため、ルールは で、データベースごとに異なります。

ストアドプロシージャのクエリは、 setFirstResult()/ setMaxResults()でページすることはできません。

推奨される呼び出し形式は、標準SQL92です。 = functionName()}または{? 。。= PROCEDURENAME(}呼び出すネイティブ呼び出し構文がサポートされていない

Oracleの場合、次の規則が適用されます。

関数は、結果セットを返さなければならない 手順の最初のパラメータが返さOUTでなければなりません。あなたが に必要な結果セット。これは、OracleでのOracle 9と10では、SYS_REFCURSORを使う によって行われるには、REF CURSOR型を定義します。 詳細は、Oracleの文献を参照してください。

のSybaseやMS SQLサーバの場合以下の規則が適用されます:

プロシージャは結果セットを返す必要があります。これらのサーバ は複数の結果セットと更新カウントを返すことができるので、Hibernateは結果を反復し、結果セットを返す値 として最初の結果を取ります。それ以外はすべて破棄されます。

あなたの手順でSET NOCOUNT ONを有効にすることができれば、それはおそらく 、より効率的になりますが、これは必須ではありません。

はSO基本的にあなたがsession.connectionを使用して休止状態からJDBC接続を取得しようとし、その後

+0

は、それに応じて、まだ同じエラーをしました。 – Manohar

+0

だからあなたの最初のパラメータは、あなたがそれのように見えませんでし貼り付ける何からストアドプロシージャを呼び出すためのだって、出力パラメータがありますか?あなたがルールに続き、あなたはまだ取得している場合 – Eosphorus

+0

エラーが多分代わりに名前付きクエリとしてクエリを使用してみてください。 – Eosphorus

関連する問題