13

PostgreSQL documentation एक CallableStatement उपयोग करने की सलाह संग्रहित प्रक्रियाओं कॉल करने के लिए।संग्रहित प्रक्रियाओं: CallableStatement बनाम PreparedStatement

String callString = "{ call rankFoos(?, ?) }"; 
CallableStatement callableStatement = con.prepareCall(callString); 
callableStatement.setString(1, fooCategory); 
callableStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

और एक नियमित रूप से PreparedStatement का उपयोग कर:

String queryString = "SELECT FooUID, Rank FROM rankFoos(?, ?);"; 
PreparedStatement preparedStatement = connection.prepareStatement(queryString); 
preparedStatement.setString(1, fooCategory); 
preparedStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

मैं समझता हूँ के रूप में, CallableStatement प्रस्तावों

एक संग्रहीत प्रक्रिया है कि एक rowset रिटर्न के मामले में, CallableStatement का उपयोग कर के बीच मतभेद रहे हैं संग्रहीत प्रक्रियाओं को कॉल करने का एक भाषा-अज्ञेय तरीका। हालांकि यह मेरे लिए कोई फर्क नहीं पड़ता, क्योंकि मुझे पता है कि मैं PostgreSQL का उपयोग कर रहा हूं। जहां तक ​​मैं देख सकता हूँ, PreparedStatement का उपयोग करने का स्पष्ट लाभ एक अधिक बहुमुखी क्वेरी, आदि एक मेज, जिस पर मैं उपयोग कर सकते हैं WHERE, JOIN, ORDER BY,

के रूप में जमा की प्रक्रिया का इलाज कर रहे हैं वहाँ पहलुओं या मतभेद है उन तरीकों के बीच जो मुझे याद आ रही है? किसी क्वेरी के रूप में उपयोग की जाने वाली संग्रहीत प्रक्रिया के मामले में, जिसकी अनुशंसा की जाती है?

उत्तर

12

मुझे पूरा यकीन है कि दूसरा दृष्टिकोण कुछ आरडीबीएमएस के साथ बिल्कुल काम नहीं करता है, लेकिन चूंकि आप केवल पोस्टग्रेएसक्यूएल का उपयोग करने जा रहे हैं, इससे कोई फर्क नहीं पड़ता। आपके साधारण मामले के लिए, वास्तव में बहुत अधिक नकारात्मक नहीं है। वहाँ दो मुद्दों मैं पॉपिंग देख सकते हैं:

  1. कैसे संग्रहित प्रक्रियाओं लिखा जाता है पर निर्भर करता है, वे आदेश प्रक्रिया निष्पादित करने के लिए में पैरामीटर बाहर पंजीकृत करने की आवश्यकता हो सकती है। तैयार बयान के साथ यह संभव नहीं होगा। यदि आप संग्रहीत प्रक्रिया और कॉलिंग कोड दोनों के निर्माण को नियंत्रित करते हैं, तो आपको शायद इसके बारे में चिंता करने की आवश्यकता नहीं है।

  2. यह संग्रहीत प्रक्रियाओं को पहली जगह कॉल करने की प्रभावशीलता को सीमित करता है। संग्रहीत प्रक्रिया के मुख्य लाभों में से एक डेटाबेस स्तर पर क्वेरीिंग तर्क को समाहित करना है। यह आपको क्वेरी को ट्यून करने की अनुमति देता है या कुछ मामलों में आपके कोड में बदलाव किए बिना कार्यक्षमता जोड़ता है। आप जोड़ जहां खंड संग्रहीत प्रक्रिया कॉल के परिणामों को मिलती है पर योजना बना रहे हैं, क्यों नहीं बस मूल प्रश्न अपने जावा परत में डाल?

7

मुख्य अंतर स्वतंत्रता और प्रोग्रामिंग के encapsulated तरीका है।

कल्पना कीजिए कि आप जावा प्रोग्रामर हैं और आप नहीं जानते कि डेटाबेस का उपयोग कैसे करें, इस तरह आप दूसरी विधि का उपयोग नहीं कर सकते हैं और आप दूसरी तरफ समस्याओं को पूरा करेंगे।

पहली विधि आपको अपना जावा कोड करने की अनुमति देती है, और किसी को आपके लिए संग्रहित प्रक्रिया के रूप में क्वियर लिखने के लिए कहती है, ताकि आप उन्हें आसानी से उपयोग कर सकें।

मैं @dlawrence

+0

अच्छी अंतर्दृष्टि से सहमत हूं। धन्यवाद! –

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