2016-01-22 7 views
9

इस प्रश्न के भीतर चर्चा की गई कार्यक्षमता दिए गए SQL स्क्रिप्ट को निष्पादित करना है। स्क्रिप्ट की सामग्री को एप्लिकेशन रनटाइम के दौरान उपयोगकर्ता द्वारा परिभाषित किया जाना है। स्क्रिप्ट यह हो सकती है कि एक INSERT कथन या जटिल PL/SQL कथन का अनुक्रम हो सकता है या नहीं। चूंकि रनटाइम के दौरान उपलब्ध इनपुट (अंत में स्ट्रिंग इंस्टेंस के रूप में) इसे जावा के माध्यम से निष्पादित किया जाना चाहिए।जावा में SQL स्क्रिप्ट निष्पादन के लिए सामान्य दृष्टिकोण

वर्तमान दृष्टिकोण PreparedStatement के साथ उपयोगकर्ता इनपुट लपेट रहा है और इसे निष्पादित करने के लिए है। यह समाधान मौजूदा परीक्षण मामलों के लिए काम करता है। मुख्य चिंता उन डेटाबेसों की पूर्ण कार्यक्षमता प्रदान करना है जो परीक्षणों द्वारा कवर नहीं हो सकते हैं, यानी समाधान जो उपयोगकर्ता वेंडर के प्रदत्त कंसोल में समान उपयोगकर्ता SQL स्क्रिप्ट को पास करने के निकटतम है।

मुझे आश्चर्य है कि PreparedStatement के साथ मौजूदा दृष्टिकोण में कोई सीमा नहीं है? जावा के माध्यम से एसक्यूएल स्क्रिप्ट निष्पादन के लिए कोई बेहतर सामान्य दृष्टिकोण है?

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? क्या आप बस सबकुछ चलाने के लिए चाहते हैं, क्या आप http://sqlfiddle.com/ जैसे कुछ बनाने की कोशिश कर रहे हैं? –

+1

क्या सुरक्षा भेद्यताएं यहां एक चिंता हैं? स्क्रिप्ट को संभावित रूप से अवांछित या खतरनाक करने से रोकने के लिए पर्याप्त प्रतिबंध हैं? (उदा। डेटाबेस में उपयोगकर्ता के विशेषाधिकारों के माध्यम से?) –

+0

@SteveChambers में कोई भेद्यता चिंता नहीं है, क्योंकि उपयोगकर्ता अपने डेटाबेस को संशोधित करता है और इसके लिए पूरी तरह उत्तरदायी होता है। मुख्य चिंता डेटाबेस की पूर्ण कार्यक्षमता को सबसे कुशल तरीके से प्रदान करना है। –

उत्तर

4

खैर, यह एक व्यापक डिजाइन सवाल है, लेकिन मुझे लगता है कि वहाँ कई कदम है कि किया जा सकता है कर रहे हैं:

  • SQL स्क्रिप्ट पार्स और मान्यता: आप एसक्यूएल किस प्रकार का पता लगाने में सक्षम होने की जरूरत है आपके पास स्क्रिप्ट है: पीएल/एसक्यूएल, डीएमएल, डीडीएल, सीडीएल, टीसीएल, मल्टीपार्ट ";" से अलग आदि
  • स्टेटमेंट बिल्डिंग: प्रत्येक प्रकार की एसक्यूएल स्क्रिप्ट के लिए आपको जावा के साथ कथन निष्पादित करने में सक्षम होना चाहिए।
  • परिणाम पार्सिंग। आपको SELECTs में लौटाए जाने और वैकल्पिक रूप से फ़ंक्शंस या प्रभावित/सम्मिलित पंक्तियों की संख्या द्वारा लौटाए जाने वाले पैरामीटर एकत्र करने में सक्षम होना चाहिए।
  • को संभालने में त्रुटि: आपको एसक्यूएल स्क्रिप्ट के साथ क्या हुआ, इसकी रिपोर्ट करने में सक्षम होना चाहिए जब चीजें अपेक्षित रूप से काम नहीं करतीं।

पर विचार करें:

  • यह एक एसक्यूएल ग्राहक की प्रोग्रामिंग की तरह लगता है। यदि नहीं, तो कृपया बताएं कि आप क्या करना चाहते हैं। सामान्य अनुप्रयोग में कनेक्शन परत के रूप में इसका उपयोग न करें। यह एसक्यूएल इंजेक्शन के लिए बेहद अक्षम और कमजोर होगा (यह अल्पविरामों को स्कैप करने से कहीं अधिक जटिल है)
  • आप बाहरी पैरामीटर के साथ कार्यों को निष्पादित करना चाहते हैं।
  • इसमें उपयोगकर्ता इंटरफेस सुविधाओं जैसे सिंटैक्स हाइलाइटिंग शामिल नहीं है। पैरामीटर्स इंटरफेस, आदि ...
+0

से समन्वयित कर सकते हैं प्रश्न का अद्यतन, @borjab कृपया –

+0

प्रश्न के नए संस्करण पर विचार करें मैंने एक [ओपन सोर्स प्रोजेक्ट] (https://github.com/jonheller1/plsql_lexer) बनाया है जो उपर्युक्त चरणों में से कई के साथ मदद कर सकता है। यह एसक्यूएल \ * प्लस कैसे बयान वर्गीकृत करता है, बयान वर्गीकृत करता है, इसलिए आप जानते हैं कि उनके साथ क्या करना है, अनावश्यक अर्धविरामों को हटाएं (कुछ कथनों की आवश्यकता है और कुछ नहीं करते हैं), और SQL \ * Plus (उदा। एक मर्ज स्टेटमेंट के लिए "5 पंक्तियां विलय हो गईं।"। यह सब पीएल/एसक्यूएल में है लेकिन इसे जावा से कॉल करना संभव होना चाहिए। –

0

जो मन में आता PreparedStatement के पहले सीमा - आप एक संग्रहीत प्रक्रिया का एक OUT पैरामीटर (रों) रजिस्टर करने के लिए सक्षम नहीं होगा, तो आप CallableStatement इंटरफेस में देखना चाहते हो सकता है ।

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