首页 > 解决方案 > 如何禁用从 MYSQL Workbench 上的 EXECUTE STATEMENT 返回的结果集

问题描述

我正在使用 MySQL 5.6 版本的 InnoDB,并且我创建了一个存储过程来对我的模式中的所有对象运行 ANALYZE TABLE。所以我使用 CURSOR 和每一个 FETCH 执行一个循环,我运行一个 PREPARE STATEMENT EXECUTE,如下所示:

...
OPEN CURSOR_TABLE_LIST;
LOOP_TABLE_LIST: LOOP
  
  FETCH CURSOR_TABLE_LIST INTO vTableName;
    
    SET @full_stmt = CONCAT('ANALYZE TABLE mySchema.', vTableName);
    PREPARE stmt FROM @full_stmt;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    IF vExitLoop THEN
      CLOSE CURSOR_TABLE_LIST;
      LEAVE LOOP_TABLE_LIST;
    END IF;
     
END LOOP LOOP_TABLE_LIST;
...

问题是:执行 ANALYZE 过程的每个准备语句都返回一个包含 4 列的结果集,而我正在使用 MySQL Workbench。因此,如果在我的模式中存在太多表,我的 Workbench 将冻结并停止运行。

我怎样才能静默、禁用、省略或禁止执行语句返回?我知道对于简单的 SELECT 语句,我可以使用它:

SET @foo = (SELECT COL FROM TAB);

但是我可以对 PREPARE STATEMENT 结构做类似的事情吗?我尝试过的另一种可能的解决方案是在另一个“通用过程”中编写准备语句块的编程,但我也没有找到一种方法来使 CALL PROCEDURE 的返回静默......

CALL SP_EXECUTE_IMMEDIATE('ANALYZE TABLE mySchema.myTable');

我是使用 MySQL 的新手......也许我可以把这个返回放在一个表中?它与 PLSQL 或 T-SQL 完全不同......有什么想法吗?非常感谢![]的

标签: mysqlsqlstored-proceduresmysql-workbench

解决方案


分析表可选地允许您分析多个表

ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name]

https://dev.mysql.com/doc/refman/5.6/en/analyze-table.html

也许这比你刚才的一次一次的方法更合适。


推荐阅读