2009-03-11 21 views
7

Tengo una base de datos heredada de Oracle (10.2g) a la que me estoy conectando y me gustaría usar NHibernate (2.0.1) para devolver los objetos de un procedimiento almacenado. El procedimiento almacenado en cuestión utiliza un SYS_REFCURSOR para devolver los resultados. De acuerdo con el documentation esto debería ser factible, pero he encontrado un fewposts en Internet que sugieren lo contrario.Procedimientos almacenados de Oracle, SYS_REFCURSOR y NHibernate

Aquí está mi código parafraseada:

archivo de asignación:

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

procedimiento almacenado:

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; 

Respuesta

1

Por lo que recuerdo, este fue un error que también encontré hace un par de años cuando trabajaba con Oracle, he rastreado el problema en el rastreador de NH y se corrigió pero en la versión 2.1.1GA; ¿Puedes verificar que este es el mismo problema que tienes? https://nhibernate.jira.com/browse/NH-847

+0

bien, finalmente nos decidimos a mirar esto en nuestro código. Había escrito una solución, pero fue kludgy por decir lo menos. Desde entonces nos hemos actualizado a NHibernate 3.0 y usamos la sintaxis en el enlace proporcionado ({call employmentsForRegion (: regionCode)}) y funcionó !. Gracias por la respuesta tardía :). –

1

Según this page se debe utilizar llamada en lugar de EXEC. No lo he intentado, así que YMMV.

1

En su hibernación indica un tipo de devolución, pero los procedimientos de Oracle no devuelven nada. Quizás si lo cambiaras a una función que devolviera el cursor ref funcionaría correctamente. Además, creo que CALL es la sintaxis adecuada. EXEC es un comando SQL * Plus y no es realmente una declaración SQL.

2

¡Qué dolor real era esto! Esto finalmente funcionó. Convertí el procedimiento de la tienda en una función. La función devolvió sys_refcursor. Usó un mapeo similar como OP y consulta de nombre como se muestra a continuación.

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

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

Link

+1

Estoy teniendo el mismo problema y no puedo lograr que esta solución funcione. ¿Puedes proporcionar algún código? –

+0

índice fuera de rango para la función que devuelve sys_refcursor a través del mapeo {? = llamar a RS_DB.GETPERSONTEST (?) en NHibernate 4.0.4 – Sash0k

1

me encontré con este mismo problema hoy en día. Para nosotros, la solución era utilizar "CALL" en lugar de "EXEC", añadir los paréntesis "()" para la llamada al procedimiento, y envolver la llamada entre llaves "{}":

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

    { CALL RS_DB.GETPERSONTEST() } 

</sql-query> 
Cuestiones relacionadas