एक लूप में पंक्ति-दर-पंक्ति अपडेट करना लगभग हमेशा एक बुरा विचार है और होगा बेहद धीमी गति से हो और पैमाने पर नहीं होगा। आपको वास्तव में इससे बचने का एक तरीका खोजना चाहिए।
ऐसा कहने के बाद:
आपका सभी कार्य स्मृति में कॉलम मान के मान को बदलना है - आप केवल एक चर की सामग्री को संशोधित कर रहे हैं। यदि आप डेटा को अपडेट करना चाहते हैं तो आपको एक update
. की आवश्यकता होगी कथन:
आपको एक UPDATE
का उपयोग करने की आवश्यकता है लूप के अंदर:
CREATE OR REPLACE FUNCTION LoopThroughTable()
RETURNS VOID
AS
$$
DECLARE
t_row the_table%rowtype;
BEGIN
FOR t_row in SELECT * FROM the_table LOOP
update the_table
set resid = 1.0
where pk_column = t_row.pk_column; --<<< !!! important !!!
END LOOP;
END;
$$
LANGUAGE plpgsql;
ध्यान दें कि आपके पास है एक where
जोड़ने के लिए update
. की प्राथमिक कुंजी पर शर्त कथन अन्यथा आप सभी को अपडेट कर देंगे प्रत्येक . के लिए पंक्तियां लूप की पुनरावृत्ति।
ए थोड़ा एक कर्सर का उपयोग करने के लिए अधिक कुशल समाधान है, और फिर where current of
. का उपयोग करके अद्यतन करें
CREATE OR REPLACE FUNCTION LoopThroughTable()
RETURNS VOID
AS $$
DECLARE
t_curs cursor for
select * from the_table;
t_row the_table%rowtype;
BEGIN
FOR t_row in t_curs LOOP
update the_table
set resid = 1.0
where current of t_curs;
END LOOP;
END;
$$
LANGUAGE plpgsql;
नहीं। फ़ंक्शन को कॉल कॉलिंग लेनदेन के संदर्भ में चलता है। तो आपको commit
करने की आवश्यकता है SELECT LoopThroughTable()
चलाने के बाद यदि आपने अपने SQL क्लाइंट में ऑटो कमिट अक्षम कर दिया है।
ध्यान दें कि भाषा का नाम एक पहचानकर्ता है, इसके चारों ओर सिंगल कोट्स का उपयोग न करें। आपको row
. जैसे कीवर्ड के उपयोग से भी बचना चाहिए परिवर्तनीय नामों के रूप में।
डॉलर कोटिंग (जैसा मैंने किया) फंक्शन बॉडी को लिखना भी आसान बनाता है