2009-03-11 9 views
7

मेरे पास एक विरासत ओरेकल (10.2 जी) डेटाबेस है जिसे मैं कनेक्ट कर रहा हूं और मैं संग्रहीत प्रक्रिया से मुझे वापस ऑब्जेक्ट देने के लिए NHibernate (2.0.1) का उपयोग करना चाहता हूं। प्रश्न में संग्रहित प्रक्रिया परिणाम लौटने के लिए SYS_REFCURSOR का उपयोग करती है। documentation के अनुसार यह करने योग्य होना चाहिए लेकिन मुझे अन्यथा सुझाव देने वाले इंटरनेट पर fewposts मिला है।ओरेकल संग्रहीत प्रक्रियाओं, 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.1.1 जीजी पर; क्या आप सत्यापित कर सकते हैं कि यह वही समस्या है जो आपके पास है? https://nhibernate.jira.com/browse/NH-847

+0

ठीक है, आखिरकार हमारे कोड में इसे देखने के लिए गोल हो गया। मैंने एक कामकाज लिखा था लेकिन कम से कम कहने के लिए यह कट्टरपंथी था। हमने तब से एनएचबीर्नेट 3.0 में अपग्रेड किया है और प्रदान किए गए लिंक में वाक्यविन्यास का उपयोग किया है ({कॉल नियोजन फोरगियन (: क्षेत्र कोड)} और यह काम किया! देर से जवाब के लिए धन्यवाद :)। –

1

this page के अनुसार आप EXEC के बजाय कॉल का उपयोग करना चाहिए

यहाँ मेरी भावानूदित कोड है। मैंने यह कोशिश नहीं की है, इसलिए वाईएमएमवी।

1

अपने हाइबरनेट में आप रिटर्न प्रकार बताते हैं, लेकिन ओरेकल प्रक्रियाएं कुछ भी वापस नहीं करती हैं। शायद अगर आपने इसे एक ऐसे फ़ंक्शन में बदल दिया जो रेफ कर्सर लौटाता है तो यह ठीक से काम करेगा। साथ ही, मेरा मानना ​​है कि कॉल उचित वाक्यविन्यास है। EXEC एक एसक्यूएल * प्लस कमांड है और वास्तव में एक SQL कथन नहीं है।

2

यह कितना शाही दर्द था। अंततः यह काम किया। मैंने स्टोर प्रक्रिया को एक फ़ंक्शन में बदल दिया। समारोह sys_refcursor लौटा दिया। ओपी और नाम क्वेरी के रूप में समान मैपिंग का उपयोग नीचे दिया गया है।

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

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

Link

+1

मुझे एक ही समस्या है और मुझे यह समाधान काम करने के लिए नहीं मिल रहा है। क्या आप कोई कोड प्रदान कर सकते हैं? –

+0

फ़ंक्शन के लिए रेंज से बाहर सूचकांक जो मैपिंग के माध्यम से sys_refcursor देता है {? = NHBernate 4.0.4 पर RS_DB.GETPERSONTEST (?,?)} पर कॉल करें – Sash0k

1

मैं आज इस एक ही समस्या भर में आया था। हमारे लिए, ठीक "()" प्रक्रिया कॉल करने के लिए "कॉल" नहीं बल्कि "EXEC" की तुलना में उपयोग करते हैं, दौर कोष्ठक जोड़ने के लिए, और घुंघराले ब्रेसिज़ में कॉल रैप करने के लिए था "{}":

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

    { CALL RS_DB.GETPERSONTEST() } 

</sql-query> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^