PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

तालिका के माध्यम से पुनरावृति करें, प्रत्येक पंक्ति पर गणना करें

एक लूप में पंक्ति-दर-पंक्ति अपडेट करना लगभग हमेशा एक बुरा विचार है और होगा बेहद धीमी गति से हो और पैमाने पर नहीं होगा। आपको वास्तव में इससे बचने का एक तरीका खोजना चाहिए।

ऐसा कहने के बाद:

आपका सभी कार्य स्मृति में कॉलम मान के मान को बदलना है - आप केवल एक चर की सामग्री को संशोधित कर रहे हैं। यदि आप डेटा को अपडेट करना चाहते हैं तो आपको एक 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 . जैसे कीवर्ड के उपयोग से भी बचना चाहिए परिवर्तनीय नामों के रूप में।

डॉलर कोटिंग (जैसा मैंने किया) फंक्शन बॉडी को लिखना भी आसान बनाता है



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेएसक्यूएल भौतिकीकृत दृश्य

  2. पोस्टग्रेज/हाइबरनेट ऑपरेटर मौजूद नहीं है:टेक्स्ट =बाइटिया

  3. Java Enums, JPA और Postgres enums - मैं उन्हें एक साथ कैसे काम करूँ?

  4. PostgreSQL पर डेटाबेस निर्माण तिथि प्राप्त करें

  5. क्या db.Exec(...) द्वारा दी गई त्रुटि का कोई कोड है?