2015-09-19 10 views
5

मैं pgsql स्क्रिप्ट भाषा में एक समारोह बनाने हूँ के परिणामों पर दोहराएं, और क्या मैं इस बात में क्या करना चाहते हैं एक प्रश्न के परिणामों पर और प्रत्येक पंक्ति के लिए करते हैं कुछ विशिष्ट पुनरावृति है। मेरी वर्तमान कोशिश निम्न है, जहां temprow को temprow user_data.users%rowtype के रूप में घोषित किया गया है।PostgreSQL - क्वेरी

FOR temprow IN 
     SELECT * FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
    LOOP 
     SELECT user_id,user_seasonpts INTO player_idd,season_ptss FROM temprow; 
     INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) VALUES (old_seasonnum,player_idd,season_ptss); 
    END LOOP; 

हालांकि मैं इस से निम्न त्रुटि मिलती है:: ERROR: relation "temprow" does not exist प्रश्न में कोड निम्नलिखित है। यदि यह स्पष्ट है कि मैं क्या करना चाहता हूं, तो क्या आप मुझे ऐसा करने का सही तरीका बता सकते हैं?

+2

करने के लिए यह होगा सही तरीके से: "dont't पुनरावृति"। आपको लगता है कि सादा एसक्यूएल का उपयोग करके पूरी तरह से व्यवहार्य है: 'लीडरबोर्ड (ए, बी, सी) में डालें उपयोगकर्ताओं से एक्स, वाई, जेड का चयन करें; ' – wildplasser

+0

जैसा कि मैंने उत्तर में देखा है, इस बिंदु पर' old_seasonnum' नहीं चुना गया है 'user_data.users' से, लेकिन पिछले बिंदु में। –

+0

इसे निरंतर (या एक चर, plpgsql में या तैयार बयानों में) का उपयोग करने की अनुमति है जहां एक अभिव्यक्ति की आवश्यकता होती है: 'foo (ए, बी, सी) में डालें बार से 42, y, z का चयन करें;' नोट: इन आपका कोड 'old_seasonnum' भी परिभाषित नहीं किया गया है। – wildplasser

उत्तर

16

temprow एक रिकॉर्ड चर है जो पहले SELECT के प्रत्येक रिकॉर्ड के बदले में बाध्य है।

तो तुम लिखना चाहिए:

FOR temprow IN 
     SELECT * FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
    LOOP 
     INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) VALUES (old_seasonnum,temprow.userd_id,temprow.season_ptss); 
    END LOOP; 

इस पाश आगे एक भी प्रश्न के रूप में सरल किया जा सकता है:

INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) 
SELECT old_seasonnum,player_idd,season_ptss FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
+0

एक कर्सर 'FOR' /' temprow' है? क्या यह कोई लॉकिंग करता है? – Ruslan

+1

हाँ, यह एक कर्सर है, लेकिन कोई ताला 'users' तालिका – Renzo

+0

सरलीकृत एकल क्वेरी के साथ समस्या पर किया जाता है,' user_data.users' मेज से 'old_seasonnum' चयन किया जाता है नहीं है, लेकिन पिछले एक चयन से और हो जाएगा इस बिंदु पर इस्तेमाल किया। –

संबंधित मुद्दे