2012-09-06 15 views
13

मैं एक कर्सर परिणाम के माध्यम से एक MYSQL संग्रहीत प्रक्रिया में सेट लूपिंग कर रहा हूँ। मुझे एक समस्या का सामना करना पड़ रहा है जो कि लूप हमेशा अंतिम रिकॉर्ड को दो बार चलाता है। यहाँ मेरी कोड है,MYSQL कर्सर पाश, एक अतिरिक्त दौर चलाता है, क्यों?

BEGIN 
DECLARE not_found_creadit INT DEFAULT 0; 

DECLARE cur_credit CURSOR FOR 
SELECT customer_id, amount, status, user_type, employee, note FROM credit WHERE status = 'approved' AND customer_id = int_cust_id; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found_creadit = 1; 
OPEN cur_credit; 
    SET not_found_creadit = 0; 
    credit_loop : LOOP 
     IF not_found_creadit THEN 
     CLOSE cur_credit; 
     LEAVE credit_loop; 
     END IF; 
     FETCH cur_credit INTO vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note; 
     SELECT vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note; 
     ...... 
     ...... 
    END LOOP; 
END; 

मतलब अगर मैं 3 रिकॉर्ड है, पाश 4 बार चलाता है, अगर यह 10 रिकॉर्ड पाश 11 बार है रन, आदि किसी भी विचार क्या यहाँ हो रहा?

+1

यह मदद मिल सकती है बिल्कुल प्रकार बुरा है -> [कर्सर अंतिम पंक्ति से अधिक दो बार पुनरावृत्ति] (http://forums.mysql.com/read.php?102,155063,155063) – Kermit

+0

हां, वास्तव में काम किया। Thanx – Thanu

+0

लिंक अब गायब है – ejectamenta

उत्तर

16

हैंडलर, जो सेट not_found_creadit = 1, निकाल दिया जाता है से पहले को क्रियान्वित करने FETCH जब FETCH रिटर्न कोई भी पंक्ति है, लेकिन आप अपने मूल्य जाँच कर रहे हैं, तो अपने पाश के मुख्य शरीर एक अतिरिक्त समय निष्पादित करेंगे जब FETCH विफल रहता है, तो लूप लूप की शुरुआत में पुनरावृत्ति की शुरुआत में निकलता है।

तुरंत के बाद अपने चर के मूल्य की जाँच करने के लिए अपने कोड को पुनर्व्यवस्थित करें FETCH:

credit_loop : LOOP 
    FETCH cur_credit INTO vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note; 
    IF not_found_creadit THEN 
     CLOSE cur_credit; 
     LEAVE credit_loop; 
    END IF; 
    SELECT vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note; 
    ...... 
    ...... 
END LOOP; 


इसके अलावा, not_found_credit

-1

You must करने के लिए अपने चर की वर्तनी को सही करने पर विचार सही प्रकार क्योंकि मैं डिफॉल्ट लिखता हूं (मुझे नहीं पता कि आपके पास टेबल क्रेडिट में क्या है)। समाप्त यू तालिका बनाते हैं TempTable का उपयोग

TRUNCATE TempTable; 

कृपया उदाहरण पुनर्लेखन

CREATE CREATE TEMPORARY TABLE TempTable (`Id` int(11) NOT NULL auto_increment, 
    `customer_id` int(11) NOT NULL, 
    `amount` int(11) NOT NULL, 
    `status` varchar(1000) NOT NULL, 
    `user_type` int(11) NOT NULL default '0', 
    `employee` varchar(1000) NOT NULL, 
    PRIMARY KEY (`customer_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;"); 

:)

DELIMITER $$ 
    DROP PROCEDURE IF EXISTS CursorX $$ 
    CREATE PROCEDURE `CursorX`() 
    BEGIN  
      DECLARE xCustomerId int(11); 
      DECLARE xStatus int(11); 
      DECLARE xUserType varchar(255); 
      DECLARE xEmployee varchar(255); 
      DECLARE xNote varchar(255); 
      DECLARE i int(11); 
      DECLARE recordNotFound INTEGER DEFAULT 0; 
      DECLARE cur_credit CURSOR FOR SELECT customer_id, amount, status, user_type, employee, note FROM credit WHERE status = 'approved' AND customer_id = int_cust_id; 
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET recordNotFound = 1; 

      DROP TEMPORARY TABLE IF EXISTS TempTable; 
      CREATE TEMPORARY TABLE TempTable AS(SELECT * FROM credit); 

      OPEN cur_credit; 
      set not_found_creadit = 0; 
      credit_loop: LOOP 
      SET i = i +1; 
       FETCH cur_credit INTO xCustomerId,xStatus,xUserType,xEmployee,xNote; 
       IF not_found_creadit THEN 
        LEAVE credit_loop; 
       END IF; 
      END LOOP credit_loop; 
      CLOSE cur_credit; 
    select * FROM TempTable; 

    END $$