我试图在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;
krokodilko.. 9
不,这是不可能的.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
不,这是不可能的.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