我找不到任何可以使用预准备语句执行多个查询的MySQL过程的教程。每当我尝试运行这样的语句时,我都会在完成第一个查询并开始下一个查询之后完全出错(如果看到下面提供的错误,这将更加清楚)。 但是,在这里:How to execute multiple mysql queries together in PHP?,提供了一些关于如何在PHP中实现相同的线索(使用mysql dbms)。但我希望在不将其与任何其他编程或脚本语言连接的情况下实现此目的。如果可能,请帮助我。
提前致谢。 下面提供了代码片段,错误
使用学生;
delimiter //
create procedure test()
begin
set @dbname = 'test_db';
set @tablesDeletion = concat('drop table if exists ',@dbname,'.table1;',
' drop table if exists ',@dbname,'.table2;',
' drop table if exists ',@dbname,'.table3;',
' drop table if exists ',@dbname,'.table4;',
' drop table if exists ',@dbname,'.table5;',
' drop table if exists ',@dbname,'.table6;');
prepare dropTmpTables from @tablesDeletion;
execute dropTmpTables;
deallocate prepare dropTmpTables;
end//
delimiter ;
call test();
错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在删除表附近使用正确的语法(如果存在,则为test_db.table1; drop table if exists test_db.table2;博士'在第1行
答案 0 :(得分:0)
在存储过程中,您可以执行多个语句,但这不是真正的方法。相反,您需要单独准备每个DROP语句并逐个执行它们,即
set @tablesDeletion = concat('drop table if exists ',@dbname,'.table1');
prepare dropTmpTables from @tablesDeletion;
execute dropTmpTables;
deallocate prepare dropTmpTables;
真正的问题是为什么要使用静态数据库名称执行此操作。您可以改为创建存储过程来执行以下操作来执行每个单独的DROP
DELIMITER //
CREATE PROCEDURE test(dbName,tableName)
BEGIN
SET @tablesDeletion = CONCAT('DROP TABLE IF EXISTS ',dbName,'.',tableName);
PREPARE dropTmpTables FROM @tablesDeletion;
EXECUTE dropTmpTables;
DEALLOCATE PREPARE dropTmpTables;
END//
DELIMITER ;
答案 1 :(得分:0)
我已经设法解决了我的问题,如下所述,最终我能够将数千个查询从MsSQL转换为MySQL。谢谢西蒙的建议。
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `executeQuery`(IN sqlCommand text)
begin
SET @tquery = sqlCommand;
PREPARE stmt FROM @tquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
通过使用所需的查询作为参数调用此过程,我可以根据需要获得结果。例如,
CALL executeQuery (concat('drop table if exists ',dbname,'.t1'));
等等。
谢谢,