将每一行存储过程插入 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
我在 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