我试图在mysql中创建一个存储过程,它在每个请求中创建一个新表,从另一个表中复制内容,提取所需的数据,最后删除该表。存储过程相当大,所以我不可能在每个查询之后都执行,因此我试图以分号分隔的格式一起执行查询。但在最终执行时,我得到错误代码:1064。我正在尝试的方法是否可行,或者是否有更好的方法。
SET tableName = (SELECT CONCAT("table",(UNIX_TIMESTAMP(NOW()))));
SET @tquery =CONCAT('CREATE TABLE `',tableName,'` (select pt.* from post_table pt join on user u on pt.user_id=u.id where pt.client="client",pt.group="group");');
SET @tquery = CONCAT(@tquery,' SELECT * FROM ',tableName,';');
SET @tquery = CONCAT(@tquery,' DROP TABLE ',tableName,';');
PREPARE stmt FROM @tquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
不,这是不可能的。准备/执行STMT
一次只能执行一个查询,许多语句不能组合。
请参阅文档:http://dev.mysql.com/doc/refman/5.0/en/prepare.html
...包含SQL语句文本的用户变量。文本必须表示单个语句,而不是多个语句。
无论如何,为了简化代码,我将创建一个简单的过程:
CREATE PROCEDURE exec_qry( p_sql varchar(100))
BEGIN
SET @tquery = p_sql;
PREPARE stmt FROM @tquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
/
我将此过程称为主过程,以这种方式:
CALL exec_qry( 'CREATE TABLE t2 AS SELECT * FROM test');
CALL exec_qry( 'SELECT * FROM t2');
CALL exec_qry( 'SELECT count(*) FROM t2');
CALL exec_qry( 'SELECT avg(x) FROM t2');
CALL exec_qry( 'DROP TABLE t2');
请看一个演示:http://www.sqlfiddle.com/#!2/6649 a/6