0

以下のようなストアド プロシージャがあります。

create procedure composite(IN a varchar(255),IN b varchar(255),IN c datetime,IN d datetime)
begin
DECLARE str VARCHAR(255);
DECLARE count float;
SET str = '';
SET str = CONCAT("aname like '%",a,"%' "," and bname ='",b,"' ");
set @comp = CONCAT("SELECT * from abc where ",str, "GROUP BY qname");
PREPARE stmt FROM @comp;
EXECUTE stmt;
set count = found_rows();
SET STR1 = CONCAT("aname like '%",a,"%' "," and bname ='",b,"' ");
SET @sql = CONCAT("SELECT * from xyz",str,"GROUP BY DATE(FROM_UNIXTIME(abcdate)),qname");
PREPARE stmt FROM @sql;
EXECUTE stmt;
end//

これを実行すると、出力として 2 つの結果セットが得られます。つまり、2 つの select ステートメントを実行した結果です。最後の選択のみの出力が必要です。これを行う方法はありますか?

4

1 に答える 1

0

やりたいことがよくわからない。ストアドプロシージャが完全ではないと思います。

この場合、準備済みステートメントを使用する必要は本当にありますか? countフロートする必要がありますか?

たぶん、このようなものが役に立つかもしれません:

...
DECLARE count BIGINT UNSIGNED;

SELECT COUNT(*) INTO count /* Here you can use a user variable (@count) and avoiding the local variable (count) */
FROM (
    SELECT 0
    FROM abc
    WHERE aname LIKE CONCAT('%', a, '%') AND bname = b
    GROUP BY qname
) der;

SELECT aname, bname, qname
FROM xyz
WHERE aname LIKE CONCAT('%', a, '%') AND bname = b
GROUP BY qname;
...

最初のステートメントは、行数をローカル変数に格納しcount、データセットを返しません。変数名と予約語に注意してください。この場合countは許可されていますが、9.3 をお読みください。ドキュメントの予約語。

于 2013-09-17T14:04:45.930 に答える