更好的解决方案是在存储过程之外创建临时表,并让过程更新/插入到它。这样多次调用的结果可以存储在一个表中(只要插入了相同的列),最后用一个简单的SELECT
.
这是一个使用与上述#sinecospi 相同的数据的示例:
/* The data */
drop table if exists someData ;
create table someData (itemId int, itemName varchar(20), itemQty int, itemCat int) ;
insert into someData values
(1,'First', 9, 1)
,(2,'Second',50, 3)
,(3,'Third', 12, 5)
,(4,'Fourth', 7, 3)
,(5,'Fifth', 1, 2)
,(6,'Sixth', 1, 1)
,(7,'Seventh', 9, 3)
,(8,'Eighth', 0, 2);
/* The stored procedure */
DROP PROCEDURE IF EXISTS sproc;
DELIMITER //
CREATE PROCEDURE sproc(
IN fld CHAR(64),
IN tbl CHAR(64)
)
BEGIN
SET @s = CONCAT('INSERT INTO results
SELECT \'',fld,'\' AS fld, x.* FROM (
SELECT ',fld,' AS bin, COUNT(',fld,') AS ct
FROM ',tbl,'
GROUP BY bin
ORDER BY bin) x;');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
/* Calls */
CREATE TEMPORARY TABLE IF NOT EXISTS results (
fld VARCHAR(30), bin VARCHAR(30), ct FLOAT);
CALL sproc('itemQty','someData');
CALL sproc('itemCat','someData');
SELECT * FROM results;
最后,临时表results
有 2 个调用的输出。