2009-03-11 18 views
7

私は接続している旧式のOracle(10.2g)データベースを持っています.Hibernate(2.0.1)を使用してストアドプロシージャからオブジェクトを戻したいと思います。問題のストアドプロシージャは、SYS_REFCURSORを使用して結果を返します。 documentationによれば、これは実行可能なはずですが、私はそうでなければ示唆するインターネット上でfewpostsを見つけました。OracleストアドプロシージャSYS_REFCURSORとNHibernate

マッピングファイル:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
assembly="OracleStoredProcedures" namespace="OracleStoredProcedures"> 
    <class name="Person" mutable="false"> 
     <id name="PersonCode" type="AnsiString" column="PERSONCODE"> 
      <generator class="assigned" /> 
     </id> 
     <property name="Name" type="String" column="PERSON_NAME" /> 
     <property name="Surname" type="String" column="PERSON_SURNAME" /> 
    </class> 

    <sql-query name="getpeople"> 
     <return class="Person" /> 

     EXEC RS_DB.GETPERSONTEST 

    </sql-query> 
</hibernate-mapping> 

ストアドプロシージャ:

CREATE OR REPLACE PROCEDURE RS_DB.GETPERSONTEST (
    io_cursor IN OUT sys_refcursor 
) 
IS 
BEGIN 
    OPEN io_cursor FOR 
     SELECT PERSONCODE, PERSON_NAME, PERSON_SURNAME 
     FROM PEOPLE 

END GETPERSONTEST; 

答えて

1

これはバグだったことを覚えています。私は2、3年前にoracleを使って作業していましたが、NHトラッカーの問題を追跡して修正しましたが、バージョン2.1.1GAです。これがあなたと同じ問題であることを確認できますか? https://nhibernate.jira.com/browse/NH-847

+0

さて、ついに私たちのコードでこれを見て回った。私は回避策を書いていたが、それほど言わなかったのはクルージュだった。私たちはNHibernate 3.0にアップグレードして、提供されたリンク({calls employForForRegion(:regionCode)})で構文を使用しました。遅い答えをありがとう:)。 –

1

あなたの代わりにEXECのCALLを使用する必要がありますthis pageによると

ここに私の言い換えコードです。私はこれを試していないので、YMMVです。

1

休止状態では、戻り値の型を指定しますが、Oracleプロシージャは何も返しません。おそらく、それをrefカーソルを返す関数に変更した場合、それは正しく動作します。また、私はCALLが正しい構文だと信じています。 EXECはSQL * Plusコマンドであり、実際にはSQLステートメントではありません。

2

これはどのような王の痛みでしたか?これはついに働いた。私はストアプロシージャを関数に変えました。関数がsys_refcursorを返しました。以下のように、OPと名前のクエリと同様のマッピングを使用しました。

<sql-query name="getpeople"> 
<return class="Person" /> 

{ ? = call RS_DB.GETPERSONTEST } 
</sql-query> 

Link

+1

私は同じ問題を抱えていますが、私はこの解決策を働かせることができません。任意のコードを提供できますか? –

+0

インデックスは、マッピングを介してsys_refcursorを返す関数の範囲外です{? = NHibernate 4.0.4でRS_DB.GETPERSONTEST(?,?)}を呼び出す – Sash0k

1

私は今日、これと同じ問題に出くわしました。私たちにとって、この修正は、「}、{」プロシージャコールにではなく、「EXEC」よりも「CALL」、丸括弧を追加する「()」を使用し、中括弧で呼び出しをラップすることでした:

<sql-query name="getpeople"> 
    <return class="Person" /> 

    { CALL RS_DB.GETPERSONTEST() } 

</sql-query> 
関連する問題