Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将表作为变量传递给mysql存储过程中的循环_Php_Mysql_Laravel_Stored Procedures_Laravel 5 - Fatal编程技术网

Php 将表作为变量传递给mysql存储过程中的循环

Php 将表作为变量传递给mysql存储过程中的循环,php,mysql,laravel,stored-procedures,laravel-5,Php,Mysql,Laravel,Stored Procedures,Laravel 5,我希望根据作为参数传递的表存储存储过程的结果,然后从中进行循环,以便更新所选行 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 @strp

我希望根据作为参数传递的表存储存储过程的结果,然后从中进行循环,以便更新所选行

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

您可以尝试在不使用循环的情况下进行更新,使用临时表存储选择的结果:

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

问题是您不能将表名作为变量传递,或者您不知道如何存储结果并进行循环?这是我的第一个存储过程任务,尽管我知道如果代码类似于此,如何进行循环:将cur1 CURSOR声明为SELECT id FROM account WHERE date_of_birth='0000-00-00';但由于该代码不能使用参数作为表名,所以我使用SET@strpd=CONCAT语句。。。对不起,如果我的英语不好。。无论如何,谢谢!我想存储结果并进行循环。您想更新什么?我想知道如何获取“EXECUTE stmt1;”的结果然后做一个循环,这样我就可以根据表格更新每一行的状态谢谢@xcloudx,我会把结果告诉你的!谢谢我不知道为什么,但在运行该过程后,我得到一个错误代码:1327。未声明变量:temp_records,我已经检查了是否遗漏了某些内容我已经更改了示例中的插入查询,现在重试哦,谢谢,我在这里也找到了答案,正确的语法应该是insert-select。谢谢你,伙计!