2008-08-12 9 views
13

मैं MySQL में संग्रहीत प्रक्रिया बनाना चाहता हूं जिसने एक सूची तर्क के रूप में ली है। उदाहरण के लिए, कहें कि मैं एक कॉल में किसी आइटम के लिए एकाधिक टैग सेट करने में सक्षम होना चाहता हूं, फिर मैं जो करना चाहता हूं वह उस प्रक्रिया को परिभाषित करना है जो आइटम की आईडी लेता है और टैग की एक सूची सेट करता है। हालांकि, मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है, जहां तक ​​मुझे पता है, कोई सूची डेटाटाइप नहीं है, लेकिन क्या इसे किसी भी तरह नकल किया जा सकता है? टैग की सूची अल्पविराम से अलग स्ट्रिंग हो सकती है, जिसे किसी भी तरह विभाजित और लूप किया जा सकता है?क्या MySQL संग्रहीत प्रक्रियाओं में कोई सूची डेटाटाइप है, या उन्हें अनुकरण करने का एक तरीका है?

आप आमतौर पर MySQL संग्रहीत प्रक्रियाओं में सूचियों के साथ कैसे काम करते हैं?

उत्तर

8

This लेख कुछ अच्छी चर्चा है मैं 2 क्षेत्रों के साथ एक अलग तालिका है संग्रहित प्रक्रिया में सरणी को पार्स करने की समस्या पर संग्रहीत प्रक्रियाएं केवल वैध तालिका कॉलम डेटा-प्रकार पैरामीटर के रूप में अनुमति देती हैं।

कुछ अच्छी चीजें हैं जो आप csv तालिका प्रकार mysql में कर सकते हैं - यह है कि यदि आप डीबी में एक फ्लैट फ़ाइल लोड कर रहे हैं।

आप संग्रहीत प्रक्रिया में एक अस्थायी तालिका बना सकते हैं, सीएसवी सूची में पुनरावृत्त कर सकते हैं और इसे temp तालिका में डालें, फिर उस कर्सर को बनाएं जो उस तालिका के मानों का चयन करता हो। उपर्युक्त धागे में यह answer ऐसा करने का एक तरीका दिखाता है।

आम तौर पर मैं डेटाबेस में आने से पहले सरणी को विभाजित करता हूं और फिर प्रत्येक आइटम पर व्यक्तिगत रूप से क्वेरी निष्पादित करता हूं।

0

सुनिश्चित नहीं है कि ये विशेष रूप से एक एसपी में काम करेंगे, लेकिन MySQL 5 में ENUM और SET डेटाटाइप हैं जो आपको चाहिए जो कर सकते हैं। http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

+0

enums और sets केवल स्ट्रिंग पर लागू होते हैं। enums केवल एक मान से एक मान की अनुमति देता है, इसलिए मानों की एक चर संख्या की अनुमति न दें। मुझे यह भी संदेह है कि एसईटी डाटाटाइप को संग्रहीत प्रक्रिया में पूर्वनिर्धारित किया जाना चाहिए, इसलिए सीमित उपयोग है (नहीं कि मैं इसे किसी भी तरह से काम कर सकता हूं ...) – beldaz

0

विकल्प, सी # के अपने प्रोग्रामिंग भाषा में, मैं वास्तव में इस आवेदन अपने आप में हालांकि करते हैं, क्योंकि विभाजन() कार्य करता है और छोरों सी # तो एसक्यूएल में कार्यक्रम करने के लिए आसान कर रहे हैं,!

शायद आपको SubString_Index() फ़ंक्शन पर देखना चाहिए।

उदाहरण के लिए, निम्नलिखित गूगल वापसी होगी:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1); 
1

कैसे जटिल आप प्राप्त करना चाहते हैं पर निर्भर करता है, तो आप एक सामान्य जोड़ने तालिका का उपयोग कर सकते हैं। मेरे अनुप्रयोगों में से एक के लिए ऐसी कई रिपोर्टें हैं जहां उपयोगकर्ता चुन सकते हैं, उदाहरण के लिए ग्राहकों की सूची कॉम्बो बॉक्स से केवल एक ग्राहक की बजाय रिपोर्ट चलाने के लिए।

  • UniqueID (GUID)
  • ItemID

छद्म-कोड इस तरह दिखता है:

GUID guid = GenerateGUID() 
try 
    for each customer in customerList { INSERT(guid, customerId) } 
    ExecuteSQLPocedure(guid) 
    --the procedure can inner-join to the list table to get the list 
finally 
    DELETE WHERE UniqueID=guid