मैं MySQL में एक पुनरावर्ती संग्रहित प्रक्रिया का उपयोग कर रहा हूं id_list
, जिसे एक अस्थायी तालिका कहा जाता है , लेकिन मुझे उस प्रक्रिया के परिणामों का चयन अनुवर्ती क्वेरी में करना चाहिए, इसलिए मैं DROP
प्रक्रिया के भीतर अस्थायी तालिका नहीं बना सकता ...
BEGIN;
/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);
/* uses the results of the stored procedure in the WHERE */
SELECT a.User_ID
FROM usr_relationships r
INNER JOIN usr_accts a ON a.User_ID = r.User_ID
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
GROUP BY r.User_ID;
COMMIT;
प्रक्रिया को कॉल करते समय, पहला मान उस शाखा का शीर्ष आईडी है जो मैं चाहता हूं, और दूसरा वह है tier
जो प्रक्रिया पुनरावृत्ति के दौरान उपयोग करती है। पुनरावर्ती लूप से पहले यह जांचता है कि क्या tier = 0
और अगर यह चलता है:
DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT NULL) ENGINE=memory;
तो मेरा सवाल है: अगर मैं प्रक्रिया के अंत में, या अपने लेन-देन के भीतर DROP
अस्थायी MEMORY
तालिका नहीं रखता हूं, तो वह तालिका कितनी देर तक स्मृति में बनी रहेगी? एक बार सत्र समाप्त होने के बाद क्या यह स्वचालित रूप से गिरा दिया जाता है, या जब तक कनेक्शन खुला रहता है, तब तक यह मेमोरी में बना रहेगा?
** एनबी स्पष्ट कथन के बयान से पहले अस्थायी तालिका को छोड़ने के लिए हो सकता है, लेकिन एक पल के लिए मान लेता है कि मैं ऐसा नहीं कर सकता। *
संपादित करें : थोड़ा और सटीक होने के लिए, यदि निरंतर कनेक्शन कार्यरत हैं, तो क्या तालिका कई अनुरोधों के माध्यम से बनी रहेगी? अब तक ऐसा लगता है कि यह और उस संसाधन को मुक्त करने के लिए हमें स्पष्ट रूप से अस्थायी तालिका को हटाने की आवश्यकता होगी।
अद्यतन : टिप्पणीकारों की सलाह के आधार पर, मैंने अपनी संग्रहीत प्रक्रिया को समायोजित करने का एक तरीका ढूंढ लिया है ताकि मैं TEMP मेमोरी तालिका का उपयोग कर सकूं, लेकिन DROP
अंत में इसे स्पष्ट रूप से सक्षम कर सकूं ...
केवल संग्रहीत कार्यविधि को कॉल करने और वास्तविक क्वेरी में परिणाम एकत्र करने के लिए शेष TEMP तालिका का उपयोग करने के बजाय, मैंने इस तरह CALL
एक तीसरे OUT
चर का उपयोग करने के लिए प्रारूप को बदल दिया है:
CALL fetch_inheritance_groups('abc123','0',@IDS);
... तो संग्रहीत प्रक्रिया के भीतर, मैंने IF tier = 0
निम्नलिखित के साथ बहुत अंत में एक दूसरा जोड़ा :
IF tier = 0
THEN
SELECT GROUP_CONCAT(DISTINCT iid SEPARATOR ',') FROM id_list INTO inherited_set;
DROP TEMPORARY TABLE IF EXISTS id_list;
END IF;
तो संग्रहीत प्रक्रिया का परिणाम अब आईडी की एक अल्पविराम से अलग सूची है जो संगत है FIND_IN_SET
, और इसलिए अंतिम क्वेरी को संशोधित किया गया था:
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
... अब है ...
WHERE r.Group_ID = 'abc123' OR FIND_IN_SET(r.Group_ID,@IDS)
देखा! आपके इनपुट के लिए टिप्पणीकारों के लिए धन्यवाद, और मुझे कारण देने के लिए मुझे थोड़ा कठिन प्रयास करने की आवश्यकता थी :)
DROP
से अस्थायी मेमोरी की आवश्यकता होगी तालिका। क्या मैं सही तरीके से मान लेता हूं?