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

 五洋顽石_449 发布于 2023-02-12 23:04

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

1 个回答
  • 不,这是不可能的.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

    2023-02-12 23:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有