साइड इफेक्ट के साथ मानक एसक्यूएल फ़ंक्शन हैं?


11

क्या SQL मानक साइड-इफेक्ट्स वाले कार्यों को परिभाषित करते हैं?

उदाहरण के लिए, क्या उनके पास फाइल में लिखने के लिए कार्य हैं * या जब आप कुछ ऐसा करते हैं तो किसी तालिका के कुछ स्तंभों में मान अपडेट करने के लिए

SELECT myfunction(params...);

मैंने कभी-कभी ये देखा है, लेकिन मैं उत्सुक हूं कि अगर SQL मानक ऐसा ही करते हैं।


* यह विशेष रूप से PostgreSQL के बारे में एक सवाल नहीं है। मैं केवल PostgreSQL में देखे गए साइड-इफेक्ट्स के उदाहरणों का उपयोग कर रहा हूं।


विभिन्न प्लेटफार्मों में फ़ंक्शंस बहुत अलग हैं, लेकिन हाँ, ईमेल भेजने के लिए ओरेकल में काफी मानक (यानी ओरेकल-प्रदत्त) ऐड-ऑन फ़ंक्शन हैं। और SQL सर्वर में NEWID और RAND जैसे nondeterministic फ़ंक्शन हैं, और SQL सर्वर में फ़ंक्शन विस्तारित प्रक्रियाओं को भी कह सकते हैं।
केड रूक्स

3
सवाल यह है कि अगर " करता है SQL मानक कार्यों कि शामिल है साइड इफेक्ट " मुझे लगता है जवाब नहीं है। यदि प्रश्न " क्या SQL मानक उन कार्यों को लिखने की अनुमति देता है जिनके दुष्प्रभाव हैं " तो मुझे लगता है कि उत्तर हां है।
a_horse_with_no_name

@a_horse_with_no_name, धन्यवाद। मेरा प्रश्न शैली और सम्मेलन के बारे में पूर्व था।
टिनिसेक्स

जवाबों:


18

आपके यहाँ कुछ अलग प्रश्न हैं।

प्रश्न: एएनएसआई मानक एसक्यूएल फ़ंक्शन क्या हैं?

ANSI मानक कार्य AVG, COUNT, MIN, MAX जैसी चीज़ें हैं। वे 1992 के एएनएसआई मानक में शामिल हैं , लेकिन यह एक सूखी, उबाऊ पढ़ने की एक बिल्ली है।

प्रश्न: क्या एएनएसआई मानक एसक्यूएल फ़ंक्शन डेटाबेस में डेटा बदलते हैं?

नहीं। आप डेटा बदलने के लिए उनका उपयोग कर सकते हैं - उदाहरण के लिए, मैं कह सकता हूं:

INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales

लेकिन स्वयं के द्वारा, केवल AVG, COUNT, MIN, MAX, आदि का उपयोग आपके डेटाबेस के अंदर स्थायी रूप से डेटा नहीं बदलना चाहिए।

प्रश्न: क्या एएनएसआई मानक मुझे अपने कार्यों को लिखने की अनुमति देता है?

हां, लेकिन सटीक कार्यान्वयन विक्रेता से विक्रेता तक भिन्न होता है। आपके द्वारा लिखे गए कार्य एएनएसआई भाषा मानक के अनुरूप हो सकते हैं, लेकिन आप अपने कार्य के अंदर जो करते हैं वह भयानक रूप से भयानक हो सकता है, जैसे साइड इफेक्ट्स बनाना।

  • इच्छित व्यवहार पर चर्चा करते समय , क्रॉस-प्लेटफ़ॉर्म उत्तर प्राप्त करना संभव है।
  • साइड इफेक्ट्स पर चर्चा करते समय , यह नहीं है।

प्रश्न: क्या मैं डेटा लिखने के लिए अपना स्वयं का फ़ंक्शन बना सकता हूं?

क्यों यकीन है, अगर आप रचनात्मक हैं। मैं एक Microsoft SQL सर्वर आदमी हूँ, इसलिए मैं उस प्लेटफ़ॉर्म पर ध्यान केंद्रित करने जा रहा हूँ। पुस्तकें ऑनलाइन के समारोह पृष्ठ कहते हैं:

उपयोगकर्ता-परिभाषित फ़ंक्शन का उपयोग उन क्रियाओं को करने के लिए नहीं किया जा सकता है जो डेटाबेस स्थिति को संशोधित करते हैं।

जिस पर मैं कहता हूं:

तुम मेरे असली पिता नहीं हो।

तो यहाँ है कि मैं नियम कैसे तोड़ूँगा। चेतावनी: बहुत बुरे विचारों का पालन करते हैं।

  • अपने फ़ंक्शन में, इस बुरे उद्देश्य के लिए विशेष रूप से बनाई गई एक नई तालिका को क्वेरी करें, और फिर कुछ ऐसा बनाएं जो चयनित बयानों के लिए तालिका देखता है, और फिर एक कार्रवाई (विस्तारित ईवेंट, ऑडिटिंग या एक प्रॉइलर ट्रेस) को आग लगाता है। आप उन चुनिंदा कथनों के आधार पर काम करने के लिए एक साथ एक रब गोल्डबर्ग तरह के गर्भनिरोधक को हुक कर सकते हैं।
  • फ़ंक्शन में, सीएलआर कोड - हेक को कॉल करें , आप एक वेब सेवा भी कॉल कर सकते हैं । वह वेब सेवा आपके डेटाबेस में डेटा को बहुत अच्छी तरह से पीछे धकेल सकती है।
  • फ़ंक्शन में, xp_cmdshell को कॉल करें और कमांड प्रॉम्प्ट के माध्यम से कुछ करें । (टिप्पणियों में HT @AaronBertrand।)

इन सभी उदाहरणों में प्रदर्शन और लेन-देन की निरंतरता के रूप में बड़ी कमियां हैं। आपने अभी पूछा कि क्या यह सैद्धांतिक रूप से किया जा सकता है, और इसका उत्तर हां है। मैं कभी भी अपने कोड में उन दोनों में से किसी का भी उपयोग नहीं करूंगा - मैं वापस कदम रखूंगा और पूछूंगा, "मैं यहां क्या हासिल करने की कोशिश कर रहा हूं, व्यापार का लक्ष्य क्या है, और क्या ऐसा कोई तरीका है जिससे मैं प्रदर्शन और लेन-देन की निरंतरता प्राप्त कर सकता हूं ? " यदि आप उन पर विशिष्ट सलाह चाहते हैं, तो मैं विशेष के साथ एक अलग स्टैक प्रश्न पूछूंगा।


धन्यवाद। क्या PSM फ़ंक्शन या प्रक्रिया को साइड इफेक्ट की अनुमति देता है, यह देखते हुए कि SQL मानक नहीं करता है?
टिम


-3

मैं केवल SQL सर्वर के बारे में निश्चित रूप से बोल सकता हूं, और ऐसा प्रतीत होता है कि यह सभी डेटाबेस कार्यान्वयन के अनुरूप नहीं है। लेकिन SQL सर्वर में, फ़ंक्शन साइड इफेक्ट का उत्पादन नहीं कर सकता है। यह एक कठिन और तेज़ नियम है जिसे मैंने बिना किसी सफलता के कई बार दरकिनार करने की कोशिश की है।

यदि आप सामान्य अर्थों में कार्यों के बारे में सोच रहे हैं, तो SQL मॉड्यूल हैं जो साइड इफेक्ट्स (उदाहरण के लिए संग्रहीत प्रक्रियाओं) की अनुमति देते हैं, लेकिन उपयोगकर्ता-परिभाषित फ़ंक्शन नहीं करते हैं।

एक कहावत है "चतुर समाधान मत पैमाने" जो विशेष रूप से Microsoft उत्पादों के साथ सच है। मैंने SQL सर्वर के शुरुआती संस्करणों में कई चतुर वर्कअराउंड देखे हैं जो बाद के संस्करणों में अप्रचलित हो गए, क्योंकि एमएस ने उन्हें सच्ची सुविधाओं के रूप में जोड़ा।

जो सुविधाएँ कभी नहीं बनीं, ईमानदारी से, कभी भी वे सुविधाएँ नहीं बन पाईं क्योंकि उन्होंने मूलभूत रूप से टी-एसक्यूएल विकास के कुछ पहलू को तोड़ दिया था। कार्यों में साइड इफेक्ट उनमें से एक है।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट 9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.