【问题标题】:Passing a table as variable for looping in mysql stored procedure将表作为变量传递以在 mysql 存储过程中循环
【发布时间】:2015-05-05 08:21:09
【问题描述】:

我想根据作为参数传递的表存储我的存储过程的结果,然后从中创建一个循环,以便我可以更新选定的行。

CREATE DEFINER=`root`@`localhost` PROCEDURE `close_transaction_procedure`(IN `tablename` VARCHAR(100), IN `businessdate_column` VARCHAR(40), IN `primary_number` VARCHAR(30), IN `lead_time` INT)
BEGIN

SET @strprd = CONCAT('SELECT ',primary_number, ', status_code FROM ',tablename,' WHERE ',businessdate_column ,' < DATE_SUB(NOW(), INTERVAL ', lead_time ,' DAY)');

PREPARE stmt1 FROM @strprd;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

-- loop based on results of execute stmt1

END

【问题讨论】:

  • 问题是你不能将表名作为变量传递,或者你不知道如何存储结果并进行循环?
  • TBH 它是我的第一个存储过程任务,但如果代码与此类似,我知道如何创建循环:DECLARE cur1 CURSOR FOR SELECT id FROM account WHERE date_of_birth = '0000-00-00' ;但由于该代码不能使用参数作为表名,我使用了 SET @strprd = CONCAT() 语句......对不起,如果我的英语不好......无论如何谢谢!
  • 我想存储结果并循环
  • 你要更新什么?
  • 我想知道如何得到'EXECUTE stmt1;'的结果然后做一个循环,以便我可以根据表格更新每一行的状态

标签: php mysql laravel stored-procedures laravel-5


【解决方案1】:

您可以尝试不循环更新,使用临时表来存储选择的结果:

CREATE DEFINER=`root`@`localhost` PROCEDURE `close_transaction_procedure`(IN `tablename` VARCHAR(100), IN `businessdate_column` VARCHAR(40), IN `primary_number` VARCHAR(30), IN `lead_time` INT)
BEGIN

/* create a temporary table where you'll store your select's result */
DROP TEMPORARY TABLE IF EXISTS temp_records;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_records
(
  primary_number VARCHAR(100),
  status_code VARCHAR(100)
);

/* store the result of the select into temp_records with the INSERT...SELECT construct */
SET @strprd = CONCAT('INSERT INTO temp_records(primary_number, status_code) SELECT ',primary_number, ', status_code FROM ',tablename,' WHERE ',businessdate_column ,' < DATE_SUB(NOW(), INTERVAL ', lead_time ,' DAY)');

PREPARE stmt1 FROM @strprd;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

/* now that you have your result in temp_records table, you can update without a loop, using temp_records table as reference */

END

【讨论】:

  • 谢谢@xcloudx,我会把结果回复给你!谢谢! :)
  • 我不知道为什么,但是运行程序后我得到一个错误代码:1327。未声明的变量:temp_records,我已经检查过我是否错过了一些东西
  • 我已经更改了示例中的插入查询,现在重试
  • 哦,谢谢,我也在这里找到了答案dev.mysql.com/doc/refman/5.1/en/insert-select.html,正确的语法应该是插入-选择。谢谢大哥!
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2012-09-03
  • 2022-09-27
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多