2009-03-11 22 views
7

Ich habe eine ältere Oracle-Datenbank (10.2g), mit der ich eine Verbindung herstelle, und ich möchte NHibernate (2.0.1) verwenden, um Objekte aus einer gespeicherten Prozedur zurückzugeben. Die gespeicherte Prozedur verwendet ein SYS_REFCURSOR, um Ergebnisse zurückzugeben. Nach der documentation sollte dies machbar sein, aber ich habe eine fewposts im Internet gefunden, die sonst vorschlagen.Gespeicherte Oracle-Prozeduren, SYS_REFCURSOR und NHibernate

Hier ist mein paraphrasierte Code:

Mapping-Datei:

<?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> 

Stored Procedure:

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; 

Antwort

1

Soweit ich mich erinnere, war dies ein Bug, den ich auch vor ein paar Jahren bei der Arbeit mit Orakel fand, ich habe das Problem in NH-Tracker zurückverfolgt und ist behoben, aber auf Version 2.1.1GA; Können Sie überprüfen, dass dies das gleiche Problem ist, das Sie haben? https://nhibernate.jira.com/browse/NH-847

+0

Okay, Schließlich haben wir uns das in unserem Code angeschaut. Ich hatte einen Workaround geschrieben, aber es war klatschig, um es gelinde auszudrücken. Wir haben seither auf NHibernate 3.0 aktualisiert und die Syntax in dem bereitgestellten Link ({call employmentForRegion (: regionCode)}) verwendet und es hat funktioniert !. Danke für die späte Antwort :). –

1

Nach this page sollten Sie CALL-anstelle von EXEC. Ich habe das nicht versucht, also YMMV.

1

In Ihrem Ruhezustand geben Sie einen Rückgabetyp an, aber Oracle-Prozeduren geben nichts zurück. Vielleicht, wenn Sie es in eine Funktion geändert haben, die den Ref-Cursor zurückgegeben hat, würde es richtig funktionieren. Außerdem glaube ich, dass CALL die richtige Syntax ist. EXEC ist ein SQL * Plus-Befehl und nicht wirklich eine SQL-Anweisung.

2

Was für ein königlicher Schmerz das war. Das hat endlich funktioniert. Ich habe die Store-Prozedur in eine Funktion umgewandelt. Funktion gab sys_refcursor zurück. Verwendet ähnliche Zuordnung wie die OP und Namen Abfrage wie folgt.

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

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

Link

+1

Ich habe die gleichen Probleme und ich kann diese Lösung nicht zum Laufen bringen. Können Sie einen Code bereitstellen? –

+0

Index außerhalb des Bereichs für die Funktion, die sys_refcursor über das Mapping zurückgibt {? = RS_DB.GETPERSONTEST (?,?)} auf NHibernate 4.0.4 aufrufen – Sash0k

1

ich heute über das gleiche Problem kam. Für uns war das Update „CALL“ statt „EXEC“, fügen Sie die runden Klammern „()“ auf den Prozeduraufruf zu verwenden, und wickeln Sie den Anruf in geschweiften Klammern „{}“:

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

    { CALL RS_DB.GETPERSONTEST() } 

</sql-query>