使用mysql Prepared Statement进行冒号分隔查询

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

不,这是不可能的。 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

链接地址: http://www.djcxy.com/p/75923.html

上一篇: colon separated query using mysql Prepared Statement

下一篇: Casting in generic abstract class that implements interface