使用mysql Prepared Statement执行多个分号分隔查询

时间:2013-12-04 09:35:54

标签: mysql sql execute

我正在尝试在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;  

1 个答案:

答案 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');

看一下演示:http://www.sqlfiddle.com/#!2/6649a/6