将每一行存储过程插入 table

Insert each row of stored procedure into a table

我在 MySql 中有两个存储过程。其中一个进行计算,returns 分组进行所有操作。对于另一个存储过程,我有一个每个月运行的 WHILE 语句并调用第一个存储过程。我想得到每个组的结果并将它们保存在 table.

代码是这样的:

CREATE PROCEDURE `first`(IN `start` date, **it should be list of items** )
begin 
    SET result = 0;
    
SELECT 
    item.name,
    sum(amount) *INTO result*

FROM
    FOO
        INNER JOIN
    BAR ON id = id
WHERE
        date(someDate) < date(start) 
group by something;
end

跑步者是这样的:

CREATE PROCEDURE `runner`(IN `from` date, IN `to` date)
BEGIN
    set dateTo = date(to);

    set dateFrom = date(from);

    WHILE DATE(dateFrom) <= DATE(dateTo) DO

        call first(dateFrom, @res);

// here I need another loop through all results of the first procedure to insert each one of them in the following line.

        insert into table_x (**some values which have been returned**);
                
        SET dateFrom = DATE_ADD(dateFrom, INTERVAL 1 month);
    END WHILE;
END

我不-'认为循环和第二个过程确实是必要的

MySQL 不能 return table 数组或类似的东西,但你可以使用临时 tables

DELIMITER $$
CREATE PROCEDURE `first`(IN `start` date )
begin 
DROP TEMPORARY TABLE IF EXISTS myTable;
CREATE TEMPORARY TABLE myTABLE
SELECT 
    item.name,
    sum(amount) 

FROM
    FOO
        INNER JOIN
    BAR ON id = id
WHERE
        date(someDate) < date(start) 
group by something;
end$$
DELIMITER ;

外部程序

DELIMITER $$
CREATE PROCEDURE `runner`(IN `_from` date, IN `_to` date)
BEGIN
    set dateTo = date(_to);

    set dateFrom = date(_from);

    WHILE DATE(dateFrom) <= DATE(dateTo) DO

        call first(dateFrom, @res);



        insert into table_x (SELECT * FROM myTable);
                
        SET dateFrom = DATE_ADD(dateFrom, INTERVAL 1 month);
    END WHILE;
END$$
DELIMITER ;

您不能使动态 sql 使用不同的变量

DELIMITER $$
CREATE PROCEDURE `first`(IN `_start` date , IN _group varchar(100))
begin 
DROP TEMPORARY TABLE IF EXISTS myTable;
SET @sql := CONCAT("
CREATE TEMPORARY TABLE myTABLE
SELECT 
    item.name,
    sum(amount) 

FROM
    FOO
        INNER JOIN
    BAR ON id = id
WHERE
        date(someDate) < date(",_gRoup,") 
group by",_goup,";");

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt; 
end$$
DELIMITER ;

如果所有 ** some values ** 都被替换,这可能有效。

所需的 MySQL 最低版本为 8.0(或等效的 MariaDB 版本)。

设置@from@to两个变量,让这个脚本知道需要从哪些数据到哪个日期。

这段代码未经测试,因为OP写了"I have two stored procedures in MySql",但他使用了“**一些值**”之类的东西,这使得两个存储过程无效(叹息)。

最后的评论:当然,可以将这个完整的语句包装到一个存储过程中。 (如果进行了上述更正)

set @from = '2021-05-01';
SET @to   = '2021-06-13';

insert into table_x (** some values **) 
WITH recursive dates AS (
   SELECT @from as d
   UNION ALL
   SELECT date_add(d, INTERVAL 1 DAY) 
   FROM dates
   WHERE d<@to
   )
SELECT d, **some values which have been returned**
FROM dates
CROSS JOIN (
   SELECT 
      item.name,
      sum(amount) 
   FROM
      FOO
   INNER JOIN
      BAR ON id = id
   WHERE
      date(someDate) < date(d) 
group by something) sq