当前位置: 首页 > 知识库问答 >
问题:

使用mysql Prepared语句执行多个分号分隔的查询

阎智
2023-03-14

我试图在mysql中创建一个存储过程,它在每个请求中创建一个新表,从另一个表中复制内容,提取所需的数据,最后删除该表。存储过程相当大,所以我不可能在每个查询之后都执行,因此我试图以分号分隔的格式一起执行查询。但在最终执行时,我得到错误代码: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个答案

夏侯兴怀
2023-03-14

不,这是不可能的。准备/执行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/6649 a/6

 类似资料:
  • 问题内容: 看一个Swift 示例: 该文档指出: …代码将该视图控制器分配给本地常量sourceViewController,并检查sourceViewController上的餐属性是否为nil。 问题:用逗号分隔时,Swift是否在if语句中让您有多个条件(例如,在此示例中,后面有逗号)? 还没有在文档中看到这一点。 问题答案: 是的,当你写 只有 正确完成所有分配, Swift才会执行的主体

  • 我的mysql db jdbc驱动程序的版本是5.1.25。 我想这样执行sql查询: 我总是收到例外: 但当我从命令行运行这个相同的查询(用分号分隔)时,它工作得很好,并按预期输出了两个表。

  • 问题内容: 我想知道是否可以使用JDBC执行类似的操作,因为即使在MySQL查询浏览器中,它当前也提供了异常。 虽然我确实意识到可以拆分SQL查询字符串并执行两次语句,但是我想知道是否有一次性的方法。 问题答案: 我想知道是否可以使用JDBC执行类似的操作。 对的,这是可能的。据我所知,有两种方法。他们是 通过设置数据库连接属性以允许多个查询,默认情况下用分号分隔。 通过调用返回隐式游标的存储过程

  • 我正在使用Java (JDBC)创建一个命令行实用程序来执行SQL语句。脚本被定义为一个文本文件,有许多查询。每个查询由查询分隔符(";"分隔).输出被路由到stdout。 由于JDBC可以批量执行语句,只有当它们不返回ResultSet时,我才需要另一种方法。 截至目前,我将读取带有查询的脚本文件,按分隔符拆分它们,并分析每个查询,无论是“SELECT”查询,还是“INSERT”,“更新”,“删

  • 问题内容: 如何将这些多个查询合并为一个(可以吗?) 顺便问一下,如果在完成所有查询后再执行mysql_close($ db),那会更好吗? 问题答案: 传递到作为第五个参数。 例: 当您使用mysql_fetch_ *或mysql_num_rows或mysql_affected_rows时,仅第一条语句有效。 例如,以下代码,第一个语句为INSERT,则无法执行mysql_num_rows和my