我正在尝试在mysql中创建一个存储过程,它在每个请求上创建一个新表,从另一个表复制内容并提取所需数据,最后删除表。存储过程非常大,所以我不能在每次查询后执行EXECUTE,因此我尝试以分号分隔格式一起执行查询。但在最终执行时,我得到错误代码: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;
答案 0 :(得分:8)
不,这是不可能的。 PREPARE / EXECUTE 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');