2011-11-09 2 views
0

J'ai le code suivant qui est censé renvoyer une liste de clients qui sont plus jeunes que le paramètre d'âge fourni et un nombre total d'enregistrements trouvés.Procédure MySQL avec paramètre de curseur

Ma table se compose de: colonnes ID, FIRST_FIRSTNAME, LASTNAME, DATE_OF_BIRTH

je aurais pu facilement fait quelques erreurs dans la syntaxe, la logique et la mise en forme de cette procédure, mais pardonnez-moi, je suis nouveau à cela! Ce qui suit est ma procédure sql:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS sample_procedure$$ 

CREATE PROCEDURE sample_procedure(IN actualinput INT) 
BEGIN 
DECLARE no_more_customers int(4); 
DECLARE l_customer_count int(4); 
DECLARE l_id varchar(1); 
DECLARE l_first_name varchar(10); 
DECLARE l_last_name varchar(10); 
DECLARE l_date_of_birth varchar(20); 
DECLARE customer_list varchar(250); 

DECLARE dateinput DATE; 
SET dateinput=DATE_SUB(now(), interval actualinput year); 


DECLARE cid CURSOR FOR 
    SELECT ID, FIRST_FIRSTNAME, LAST_NAME, DATE_OF_BIRTH 
    FROM customers WHERE DATE_OF_BIRTH >= dateinput; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_customers=1; 

SET no_more_customers=0; 
SET l_customer_count=0; 


OPEN cid; 
cid_cursor: REPEAT 
    FETCH cid INTO l_id, l_first_name, l_last_name, l_date_of_birth;   IF no_more_customers THEN 
      LEAVE cid_cursor; 
     END IF; 
     SET customer_list=concat(customer_list, l_id,',',l_first_name,',',l_last_name,',',l_date_of_birth); 
     SET l_customer_count=1+l_customer_count; 

UNTIL no_more_customers 
END REPEAT cid_cursor; 
CLOSE cid; 
SET no_more_customers=0; 
SELECT customer_list AS Customers; 
SELECT concat(l_customer_count); 
END; 
$$ 

Je semblent avoir une erreur dans la méthode que j'utilisé pour calculer l'âge des clients, peut-être un problème avec la méthode que je l'habitude d'appeler le curseur et ma liste finale des clients est seulement de retour null. Merci d'avance ...

Répondre

3

Je peux supposer que la variable 'customer_list' doit être initialisée, par ex. -

... 
DECLARE customer_list VARCHAR(250) DEFAULT ''; 
... 

parce que 'SET customer_list = CONCAT (customer_list, ...)' quand customer_list est NULL, NULL retourne trop. Profitez de MySQL Stored Procedure Debugger. J'espère que cette fonctionnalité vous aidera.

+0

merci pour le conseil, le bloc-notes ne le coupait pas! – r0m4n

Questions connexes