2016-04-04 3 views
0

私は本によると、これを行うことになっています。このコードに取り組んできました:MySQLカーソルの問題:どうしたのですか?

が作成し、テストという名前のストアドプロシージャ呼び出すスクリプトを書きます。 このストアド・プロシージャは、 が各製品のproduct_nameおよびlist_price列で構成されている結果セットに対してカーソルを作成して、リスト価格が$ 700を超える を作成する必要があります。この結果の行 は、リスト価格で降順にソートする必要があります。 "Gibson SG", "2517.00" | "Gibson Les Paul", "1199.00""

は、残念ながら何私のコードが行うことは何でもするのではなく、null値を返す次のとおりです。次に、 手順は、それがこのような何か に見えるように、各製品の PRODUCT_NAMEやリストの価格を含んでいる文字列変数を表示する必要があります。私は間違って何をしていますか?いずれかの引数がnullある場合

USE my_guitar_shop; 

DROP PROCEDURE IF EXISTS test; 

DELIMITER // 

Create Procedure test() 
Begin 
    DECLARE names_var VARCHAR(50); 
    DECLARE prices_var DECIMAL (8,2); 
    DECLARE results VARCHAR(150); 
    DECLARE done TINYINT; 

    DECLARE products_cursor CURSOR FOR 
     SELECT product_name, list_price FROM products; 

    DECLARE continue handler for not found set done = 1; 
    SET done = 0; 

    OPEN products_cursor; 

    testloop : loop 
    FETCH products_cursor INTO names_var, prices_var; 
    IF done = 1 then leave testloop; 
    END IF; 

    IF prices_var > 700 THEN 
     SET results = concat(results, "names_var", ', ', "prices_var", '|'); 
    END if; 
    END loop testloop; 

    CLOSE products_cursor; 

    SELECT results; 


END // 

DELIMITER ; 

Call test; 

答えて

0

文書によると、CONCATnullを返します。あなたの選択がnullのいずれかの行から返されており、内容全体が消去されていると考えられます。resultsです。

このケースを処理するには、このように、COALESCEを使用します。変数がある場合COALESCE

IF prices_var > 700 THEN 
    SET results = concat(results, '"', COALESCE(names_var, ' '), '", "', COALESCE(prices_var, ' '), '" | '); 

呼び出しは、それがnullでない場合は、変数の値を返す、または空白の文字列' 'ヌル。

(私はまっすぐに、出力内のすべての単一および二重引用符を持っていると思うが、私は何の約束をしない;)

+0

それはしませんでした。それは列の名前を変更しただけで、私はこれらのためのパラメータを行う必要はなく、結果だけです。 – Samuel

+0

私は 'CONCAT'のためのドキュメントを読んだだけです。私は良いアイデアを持っています。 –

0

私はループに入る前に、結果の変数を初期化することによって、問題を解決し、 names_varとprices_varの引用を取り除いてください

Create Procedure test() 
BEGIN 
DECLARE names_var VARCHAR(50); 
DECLARE prices_var DECIMAL (8,2); 
DECLARE results VARCHAR(400); 
DECLARE done INT; 


DECLARE products_cursor CURSOR FOR 
    SELECT product_name, list_price 
    FROM products 
    WHERE list_price > 700 
    ORDER BY list_price DESC; 

DECLARE continue handler for not found set done = 1; 
SET done = 0; 
SET results = ''; 

OPEN products_cursor; 

testloop : loop 
FETCH products_cursor INTO names_var, prices_var; 

IF done = 1 THEN 
LEAVE testloop; 
END IF; 

SET results = concat('"', names_var, '"', ',', '"', prices_var, '"', "|", results); 

END loop testloop; 

SELECT results; 
CLOSE products_cursor; 

END //