कुछ इस तरह की चाल चलनी चाहिए (हालांकि, अधिक जानकारी के लिए स्निपेट के बाद पढ़ें)
CREATE PROCEDURE GetFilteredData()
BEGIN
DECLARE bDone INT;
DECLARE var1 CHAR(16); -- or approriate type
DECLARE Var2 INT;
DECLARE Var3 VARCHAR(50);
DECLARE curs CURSOR FOR SELECT something FROM somewhere WHERE some stuff;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
DROP TEMPORARY TABLE IF EXISTS tblResults;
CREATE TEMPORARY TABLE IF NOT EXISTS tblResults (
--Fld1 type,
--Fld2 type,
--...
);
OPEN curs;
SET bDone = 0;
REPEAT
FETCH curs INTO var1,, b;
IF whatever_filtering_desired
-- here for whatever_transformation_may_be_desired
INSERT INTO tblResults VALUES (var1, var2, var3 ...);
END IF;
UNTIL bDone END REPEAT;
CLOSE curs;
SELECT * FROM tblResults;
END
विचार करने योग्य कुछ बातें...
ऊपर दिए गए स्निपेट के बारे में:
- संग्रहीत कार्यविधि को क्वेरी का एक भाग पास करना चाह सकते हैं, शायद विशेष रूप से खोज मानदंड, इसे और अधिक सामान्य बनाने के लिए।
- यदि इस विधि को कई सत्रों आदि द्वारा बुलाया जाना है, तो एक अद्वितीय अस्थायी तालिका नाम बनाने के लिए एक सत्र आईडी पास करना चाहते हैं (वास्तव में अनावश्यक चिंता क्योंकि विभिन्न सत्र समान अस्थायी फ़ाइल नामस्थान साझा नहीं करते हैं; द्वारा टिप्पणी देखें ग्रुबर, नीचे)
- परिवर्तनीय घोषणाओं, चयन क्वेरी आदि जैसे कुछ भागों को ठीक से निर्दिष्ट करने की आवश्यकता है
अधिक सामान्यतः:कर्सर की आवश्यकता से बचने की कोशिश कर रहा है ।
मैंने जानबूझकर कर्सर चर का नाम दिया [ई], क्योंकि कर्सर एक मिश्रित आशीर्वाद हैं। वे जटिल व्यावसायिक नियमों को लागू करने में हमारी मदद कर सकते हैं जिन्हें SQL के घोषणात्मक रूप में व्यक्त करना मुश्किल हो सकता है, लेकिन यह हमें SQL के प्रक्रियात्मक (अनिवार्य) रूप का उपयोग करने के लिए लाता है, जो SQL की एक सामान्य विशेषता है जो न तो बहुत अनुकूल है/ अभिव्यंजक, प्रोग्रामिंग-वार, और अक्सर कम कुशल प्रदर्शन-वार।
हो सकता है कि आप "सादे" (घोषणात्मक) SQL क्वेरी के संदर्भ में वांछित परिवर्तन और फ़िल्टरिंग को व्यक्त करने पर विचार कर सकें।