Еще лучшим решением является создание временной таблицы вне хранимой процедуры, и процедура просто обновляет/вставляет в нее. Таким образом, результаты нескольких вызовов могут быть сохранены в одной таблице (при условии, что вставлены одни и те же столбцы) и извлечены в конце с помощью простого 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 вызовов.
person
Michal J Figurski
schedule
16.10.2020