2011-11-09 10 views
0

次のコードは、指定された年齢パラメータと見つかったレコードの合計数よりも若い顧客のリストを返すことになっています。カーソルを使用したMySQLプロシージャ

私のテーブルの構成は次のとおりです。列ID、FIRST_FIRSTNAME、LASTNAME、DATE_OF_BIRTH

を、私は簡単にこの手順の構文、ロジックと書式のいくつかのミスを犯したかもしれないが、私を許して、私はこれに新しいです!以下は、私の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; 
$$ 

私は顧客の年齢を計算するために使用される方法でのエラー、おそらく私は、カーソルを呼び出すために使用される方法の問題や顧客の私の最終的なリストを持っているように見えますnullを返すだけです。 ありがとうございます...

答えて

3

変数 'c​​ustomer_list'を初期化する必要があります。 -

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

customer_listがNULLの場合、 'SET customer_list = CONCAT(customer_list、...)'はNULLも返すためです。

MySQL Stored Procedure Debuggerを利用してください。この機能が役立つことを願っています。

+0

チップのおかげで、メモ帳はそれをカットしていませんでした! – r0m4n

関連する問題