আমি অস্থায়ী টেবিল তৈরি করতে মাইএসকিউএলে একটি পুনরাবৃত্ত হওয়া সঞ্চিত পদ্ধতি ব্যবহার করছি 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
টেবিলটি না করি, তবে কতক্ষণ সেই টেবিলটি স্মরণে থাকবে? সেশনটি শেষ হয়ে গেলে এটি কী স্বয়ংক্রিয়ভাবে বাদ পড়েছে, বা সংযোগটি খোলা থাকার সাথে সাথে এটি স্মৃতিতে থাকবে?
** এনবি এর সুস্পষ্ট উত্তর হতে পারে প্রতিশ্রুতিবদ্ধ বিবৃতি দেওয়ার আগে টেম্প টেবিলটি ফেলে দেওয়া, তবে একটি মুহুর্তের জন্য ধরে নেওয়া যাক যে আমি এটি করতে পারি না * *
সম্পাদনা : আরও কিছুটা সুনির্দিষ্ট হওয়ার জন্য, যদি অবিচ্ছিন্ন সংযোগগুলি নিযুক্ত করা হয়, তবে একাধিক অনুরোধের মাধ্যমে টেবিলটি কী অবিচল থাকবে? এখনও অবধি মনে হচ্ছে এটি হবে এবং আমাদের সেই উত্সটি মুক্ত করার জন্য স্পষ্টভাবে টেম্প টেবিলটি সরিয়ে ফেলতে হবে।
আপডেট : মন্তব্যকারীদের পরামর্শের ভিত্তিতে, আমি আমার সঞ্চিত পদ্ধতিটি সামঞ্জস্য করার একটি উপায় খুঁজে পেয়েছি যাতে আমি টেমপ মেমোরি টেবিলটি ব্যবহার করতে পারি, তবে DROP
শেষে এটি স্পষ্টভাবে বলতে সক্ষম হব ...
প্রকৃত ক্যোয়ারিতে ফলাফল সংগ্রহের জন্য কেবল সঞ্চিত পদ্ধতিটিতে কল করা এবং অবশিষ্ট টিএমপি টেবিল ব্যবহার না করে, 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
অস্থায়ী স্মৃতি টেবিল। আমি কি সঠিকভাবে ধরে নিই?