2010-07-05 3 views
6

का उपयोग संग्रहित प्रक्रिया मैं एक संग्रहीत प्रक्रिया जेपीए का उपयोग कर कॉल करने के लिए की जरूरत है और इस लेख पाया:कॉल ओरेकल createNativeQuery

http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html

बताते हैं जो EntityManager.createNativeQuery का उपयोग कैसे करें। हालांकि, उदाहरण वास्तव में एक फ़ंक्शन को कॉल करता है जिसमें वापसी तर्क होता है। मैंने एक संग्रहीत प्रक्रिया को कॉल करने का एक उदाहरण खोजने का प्रयास किया है जिसमें वापसी नहीं है, लेकिन कुछ भी नहीं मिला है।

क्या मैं प्रक्रिया को कॉल करने के लिए createNativeQuery का उपयोग कर सकता हूं? या प्रक्रिया को एक समारोह के रूप में संशोधित करने की आवश्यकता है (शायद सफलता/विफलता परिणाम देता है)?

धन्यवाद!

उत्तर

11

जेपीए विकि से:

1.4 Stored Procedures

जेपीए संग्रहित प्रक्रियाओं के लिए किसी भी प्रत्यक्ष समर्थन नहीं है। मूल प्रश्नों का उपयोग करके जेपीए में कुछ प्रकार की संग्रहीत प्रक्रियाओं को निष्पादित किया जा सकता है। जेपीए में मूल प्रश्न किसी भी एसक्यूएल को अनुमति देते हैं जो कुछ भी नहीं देता है, या डेटाबेस परिणाम सेट निष्पादित करने के लिए देता है। संग्रहीत प्रक्रिया निष्पादित करने के लिए वाक्यविन्यास डेटाबेस पर निर्भर करता है। जेपीए संग्रहित प्रक्रियाओं का समर्थन नहीं करता है जो OUTPUT या INOUT पैरामीटर का उपयोग करते हैं। डीबी 2, साइबेस और एसक्यूएल सर्वर जैसे कुछ डेटाबेस परिणाम सेट को वापस करने के लिए संग्रहित प्रक्रियाओं की अनुमति देते हैं। ओरेकल परिणाम सेट को वापस करने की अनुमति नहीं देता है, केवल OUTPUT पैरामीटर, लेकिन एक CURSOR प्रकार को परिभाषित करता है जिसे OUTPUT पैरामीटर के रूप में वापस किया जा सकता है। ओरेकल संग्रहित कार्यों का भी समर्थन करता है, जो एक एकल मूल्य वापस कर सकता है। एक संग्रहित फ़ंक्शन को सामान्य रूप से ओरेकल डुएल तालिका से फ़ंक्शन मान का चयन करके देशी SQL क्वेरी का उपयोग करके निष्पादित किया जा सकता है।

कुछ जेपीए प्रदाताओं ने संग्रहीत प्रक्रियाओं के लिए समर्थन बढ़ाया है, कुछ भी एक संग्रहित प्रक्रिया या कस्टम एसक्यूएल के साथ किसी इकाई के लिए किसी भी सीआरयूडी ऑपरेशन को ओवरराइड करने का समर्थन करते हैं। कुछ जेपीए प्रदाताओं को CURSOR OUTPUT पैरामीटर के लिए समर्थन है।

उदाहरण ओरेकल

EntityManager em = getEntityManager(); 
Query query = em.createNativeQuery("BEGIN VALIDATE_EMP(P_EMP_ID=>?); END;"); 
query.setParameter(1, empId); 
query.executeUpdate(); 

पर एक संग्रहीत प्रक्रिया को क्रियान्वित तो मेरी सलाह होगा:

  • कुछ प्रयोगों कर (यानी यह कोशिश)
  • यदि आवश्यक (और संभव हो तो) संग्रहीत प्रक्रिया को संशोधित करें
  • प्रदाता विशिष्ट एक्सटेंशन (अंतिम उपाय के रूप में)
  • 01 पर विचार करें
+0

धन्यवाद पास्कल। मुझे नहीं पता कि मैं अपनी खोज में उस पृष्ठ को कैसे चूक गया। – sdoca

1

यदि यह संभव है, आप की संभावना प्रक्रिया कॉल इस तरह से रैप करने के लिए की आवश्यकता होगी:

em.createNativeQuery("BEGIN yourprocedure; END;") 

हो रही वापसी मान वापस प्रक्रियाओं के साथ समस्याग्रस्त किया जा सकता है। उन्हें पास करना आसान होना चाहिए।