2012-01-04 11 views
5

और मैं इस पर ठोकर:जाहिर लाने रिटर्न नल मैं संग्रहित प्रक्रियाओं, mysql में कर्सर सीख रहा हूँ

delimiter // 

CREATE PROCEDURE some_func() 
BEGIN 
    DECLARE link_rewrite VARCHAR(255); 
    DECLARE link_rewrite_cursor CURSOR FOR SELECT link_rewrite FROM prod; 

    OPEN link_rewrite_cursor; 

    SET @count = 0; 

    WHILE @count < 10 DO 
     FETCH link_rewrite_cursor INTO link_rewrite; 
     SELECT link_rewrite; 
     set @count = @count + 1; 
    END WHILE; 

    CLOSE link_rewrite_cursor; 

END// 

delimiter ; 

मेरा प्रश्न है: क्यों का चयन करें link_rewrite हमेशा NULL भेजता है (prod तालिका में वहाँ 9000 पंक्तियाँ है)। Prod से link_rewrite चुनें कई पंक्तियां (9 000 पंक्तियां) लौटाती हैं।

उत्तर

0

तुम सिर्फ शीर्ष 10 पंक्तियों का चयन करना चाहते हैं, ऐसा करते हैं:

select link_rewrite from prod limit 10 

यह बहुत जल्दी है और आप एक कर्सर के साथ जाने के लिए नहीं है।

+0

'SET' इसे घोषित नहीं करता है? –

+0

@Eric यह बीक्यूज कुछ रिटर्न का चयन करता है (इस मामले में न्यूल) तो मेरी राय में यह लूप के दौरान हिट करता है। हाँ आप इसे बहुत तेज़ कर सकते हैं लेकिन मैं कर्सर और संग्रहीत प्रक्रिया सीखने की कोशिश कर रहा हूं। – PaulP

+0

@PaulP, प्रोड सीमा 10' से लिंक_rewrite का चयन क्या करता है? यदि ऐसा है, तो मेरा अनुमान है कि आपके पास तालिका में 'शून्य' मान हैं (भले ही आपके पास कितनी पंक्तियां हों)। – Eric

16

आपको कई अलग-अलग चीज़ों के लिए एक ही नाम का उपयोग करने से बचना चाहिए। विशेष रूप से, वेरिएबल को आपके द्वारा चुने गए कॉलम से भिन्न नाम दें। उदाहरण के लिए, यदि आप परिवर्तनीय v_link_rewrite का नाम बदलते हैं तो यह संभवतः काम करेगा:

delimiter // 

DROP PROCEDURE IF EXISTS some_func // 

CREATE PROCEDURE some_func() 
BEGIN 
    DECLARE v_link_rewrite VARCHAR(255); 
    DECLARE link_rewrite_cursor CURSOR FOR SELECT link_rewrite FROM prod; 

    OPEN link_rewrite_cursor; 

    SET @count = 0; 

    WHILE @count < 10 DO 
     FETCH link_rewrite_cursor INTO v_link_rewrite; 
     SELECT v_link_rewrite; 
     set @count = @count + 1; 
    END WHILE; 

    CLOSE link_rewrite_cursor; 

END// 

delimiter ; 
+0

http://bugs.mysql.com/bug.php?id=28227 –

+0

@Ike: आपने आज मुझे बचाया ;-) – Artur

+0

धन्यवाद इसने मेरी समस्या भी हल की। मेरे मामले में मैंने वैरिएबल को चयनित उपनाम के समान नाम दिया था, वास्तविक कॉलम नाम नहीं। मजेदार - मैंने सोचा कि यह उनके लिए अच्छा और साफ था, सभी को एक ही नाम दिया जाना चाहिए! – scipilot

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