2012-09-17 6 views
5

मुझे उम्मीद है कि कोई मदद करने में सक्षम होगा। मैंने अपना पहला संग्रहित प्रोडक्शन बनाया है (कुछ भी नहीं फैंसी) हालांकि मैं किसी समस्या में चल रहा हूं।MYSQL - स्टोरेज प्रक्रिया को कम करने योग्य इनपुट के रूप में कॉमा सेपरेटेड स्ट्रिंग का उपयोग

मैं इसे एक स्ट्रिंग इनपुट जैसे 1,2,3,4,5 तो यह एक साधारण SELECT * FROM [TABLE] WHERE EAN IN (VAR);

तो संग्रहीत proc इस तरह दिखता करता देना चाहता हूँ:

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255)) 
BEGIN 

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1); 

END 

इम बजे इस तरह है जैसे कि यह निष्पादित करने के लिए कोशिश कर रहा है:

वर्क्स

call moments.new_procedure('5045318357397') 

काम नहीं करता

call moments.new_procedure('5045318357397,5045318357427'); 

यह कार्यान्वित लेकिन किसी भी परिणाम वापस नहीं ला नहीं करता है। यह एक स्ट्रिंग के रूप दूसरा बयान classing है इसलिए इसकी यह कर:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427') 

और नहीं इस:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427') 

कैसे मैं निष्पादित क्वेरी में इनपुट स्वरूप का यह एक लेने के लिए प्राप्त करने के लिए है एक इनपुट के रूप में अल्पविराम अलग स्ट्रिंग?

उत्तर

12

आप इस्तेमाल कर सकते हैं:

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1) 

यह मानते हुए यह है काम करना चाहिए वास्तव में अल्पविराम सीमित। इस मामले में कोई अन्य सीमांकन काम नहीं करेगा।

+0

यह संग्रहीत प्रो के अंदर पूरी तरह से काम करता है, धन्यवाद। यह भी है कि मैं इसे कास्ट आयरन एप्लिकेशन से कैसे बुलाऊंगा, जो एक अतिरिक्त बोनस है। – MMKD

+2

यह काम करता है, लेकिन यह बहुत कुशल नहीं है क्योंकि इसे तालिका से सभी पंक्तियों को लाने की आवश्यकता है, फिर प्रत्येक पंक्ति की तुलना अपने सेट पर करें, जो बदले में अल्पविराम से अलग सूची के माध्यम से लूप करना होगा ताकि यह जांच सके कि यह मेल खाता है ... यदि आपका # कॉलम कम है, तो यह ठीक है अन्यथा आपको बल्लेबाज का रास्ता मिलना चाहिए – Populus

+0

@ पॉपुलस टिप्पणी को और अधिक उतारने की जरूरत है - FIND_IN_SET किसी भी तालिका सूचकांक का उपयोग नहीं करता है, इसलिए इस तरह से उपयोग होने पर संभावित रूप से एक बड़ी प्रदर्शन समस्या है –

1

स्ट्रिंग आप पारित कर किसी भी तरह मान्य है और दुर्भावनापूर्ण एसक्यूएल शामिल नहीं है मान लिया जाये कि, आप तैयार बयान का उपयोग कर सकते हैं:

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')'); 
EXECUTE stmt1;