2011-12-24 8 views
12

मैं PostgreSQL का उपयोग कर मूल कर्सर सीखने की कोशिश कर रहा हूं। यह मेरी स्क्रिप्ट है:PostgreSQL कर्सर

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

मैं सूची को पार करना चाहता हूं और जो सक्रिय हैं उन्हें आउटपुट करना चाहता हूं। मुझे कहां से शुरू करना चाहिए?

+1

सक्रिय लोगों का चयन करते हुए WHERE क्लॉज जोड़कर प्रारंभ करें। – aib

+2

[मैनुअल में कर्सर के बारे में अध्याय] पढ़ें (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html)। –

+0

मैंने किया, जैसा कि आप मुझसे कहा: चुनें * के लिए घोषणा cur_employees कर्सर कर्मचारी से जहां सक्रिय = 'सक्रिय' बंद cur_employees लेकिन मैं निम्नलिखित त्रुटि हो रही है: पर या निकट "बंद सिंटेक्स त्रुटि: – Karl

उत्तर

24

आप शायद ही कभी पोस्टग्रेएसक्यूएल में कर्सर का स्पष्ट रूप से उपयोग करना चाहते हैं, यहां तक ​​कि plpgsql में क्वेरी परिणामों को संसाधित करते समय भी। यह कई अन्य एसक्यूएल डेटाबेस से एक महत्वपूर्ण विपरीत है जहां उनका लगभग हर समय उपयोग किया जाता है।

plpgsql में आप बस की तरह कुछ लिख सकते हैं:

DECLARE 
    emp employee%rowtype; 
BEGIN 
    FOR emp IN SELECT * FROM employee LOOP 
    IF emp.active THEN 
     RAISE INFO 'Active: %', emp.employee_id 
    END IF; 
    END LOOP; 
END 

ऊपर में, उद्घाटन के साथ plpgsql भाषा हैंडलर सौदों, बाध्यकारी लाए जाने और खुद को बंद करने (declarations के बारे में अधिक है, और control structures)।

9.0 से पोस्टग्रेएसक्यूएल के साथ, आप बस "डीओ" ब्लॉक का उपयोग करके plpgsql निष्पादित करने में आसानी से ड्रॉप कर सकते हैं। पूर्व संस्करणों के लिए, आपको एक फ़ंक्शन बनाने और इसे चुनने की आवश्यकता है। यदि आप PostgreSQL समकक्ष की तलाश में हैं, उदाहरण के लिए, SQL सर्वर पर एक कर्सर के साथ परिणामस्वरूप पुनरावृत्ति, यह वही है। ध्यान दें कि पुनरावृत्ति इत्यादि एसक्यूएल बोली का हिस्सा है, केवल plpgsql (या अन्य किसी भी एम्बेडेड भाषाओं) का हिस्सा है।

एसक्यूएल स्तर पर "कर्सर xxx घोषणा" वाक्य रचना इस तरह इस्तेमाल किया जा सकता:

DECLARE cur_employees CURSOR FOR SELECT * FROM employee; 
FETCH NEXT FROM cur_employees; 
// etc.. 
CLOSE cur_employees; 

यह ध्यान से क्वेरी परिणाम सेट का कोई हिस्सा प्राप्त करने के लिए इस्तेमाल किया जा सकता। हालांकि, इनका उपयोग करना असामान्य है, क्योंकि आम तौर पर आपका क्लाइंट ड्राइवर ऐसा करने के लिए कुछ प्रकार की कार्यक्षमता प्रदान करेगा (उदाहरण के लिए जेडीबीसी में स्क्रोल करने योग्य परिणाम सेट)। आप कर्सर को ओरेकल के समान कार्यों से भी वापस कर सकते हैं, हालांकि फिर से तुलनात्मक रूप से दुर्लभ उपयोग केस है।

+4

+1 अभी तक उच्च गुणवत्ता का जवाब। –

+1

और याद रखें कि 90%% जो लोग क्यूसर का उपयोग करने का प्रयास करते हैं, उन्हें सेट आधारित संचालन के साथ बेहतर तरीके से संभाला जाएगा। आपको डेटा सेट के माध्यम से लूपिंग के बारे में कभी भी नहीं सोचना चाहिए और एक अनुभवी डीबीए को छोड़कर कोई भी कर्सर लिखने पर विचार नहीं करना चाहिए। यह एक तकनीक है जिसे आप तब तक नहीं सीखना चाहिए जब तक आप बहुत वरिष्ठ न हों और जानें कि यह उचित कब है। यदि आप सिर्फ एसक्यूएल सीख रहे हैं, तो इसे लगभग दस वर्षों तक छोड़ दें। – HLGEM

0

आम तौर पर, कर्सर के लिए एक डिस्लेर होता है, फिर कर्सर का एक खुला (जो परिणाम सेट को पूरा करता है), अलग-अलग परिणाम ऑपरेशन से पंक्तियों को पुनर्प्राप्त करने के लिए एकाधिक FETCH ऑपरेशंस, और फिर कर्सर का एक बंद होता है ।

आपके पास एक बंदरगाह के बाद एक बंदरगाह दिखाई देता है। इस प्रकार आपकी वाक्यविन्यास त्रुटि, जैसा आपने कभी नहीं खोल दिया।

+0

एचएम में किया जा सकता है। कार्ल ने उल्लेख नहीं किया कि क्या वह कर्सर को SQL या pl/pgsql के साथ उपयोग करना चाहता है।एसक्यूएल के लिए 'ओपन' नहीं है, क्योंकि यह निश्चित रूप से 'DECLARE' द्वारा किया जाता है। –

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

  • कोई संबंधित समस्या नहीं^_^