首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql使用存储过程从当前数据库中选择所有现有表

问Mysql使用存储过程从当前数据库中选择所有现有表
EN

Stack Overflow用户
提问于 2016-11-21 20:56:29
回答 1查看 1.6K关注 0票数 0

我仍在努力解决Mysql问题。我不是dba,但我需要弄清楚怎么做。

我需要在当前db的所有(50k)现有表上运行select语句。请注意,对于我来说,联合不是正确的方法,因为我有超过50k的表,我需要用循环来解决这个问题。

到目前为止,我一直在尝试两种方法,但都没有成功:

首先:使用子查询和类似的information_schemma:

代码语言:javascript
复制
Select * 
from 
    (SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES  
     WHERE table_schema = 'my_db')

或

代码语言:javascript
复制
Select * from (show tables;);

第二:使用如下存储过程:

代码语言:javascript
复制
delimiter //
CREATE PROCEDURE get_all_tables()
BEGIN
  DECLARE a varchar(100); 
  DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES  WHERE table_schema = 'my_db';
  OPEN cur1;

但我也不想做我想做的。

它会产生语法或概念错误。

顺便说一句:我已经使用一个外部perl脚本来解决这个问题,它执行一个“显示表”,并运行一个select循环。

这是可以的,但我认为这应该用纯mysql解决。

任何想法都是欢迎的。

利奥。

EN

回答 1

Stack Overflow用户

发布于 2016-11-21 21:43:36

代码语言:javascript
复制
SELECT * FROM (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
  WHERE table_schema = 'my_db')

首先,在SQL的任何实现中都不能这样做。表名必须由查询在准备时而不是在运行时知道.不能从字符串中进行选择,必须从表标识符中进行选择。

这是这两个查询之间的区别:

代码语言:javascript
复制
SELECT * FROM MyTable    -- identifier
SELECT * FROM 'MyTable'  -- string value (this won't work)

顺便说一句,大多数编程语言都有一个类似的概念,即函数或类名不同于该函数或类的名称。不能使用与按标识符执行函数的语法相同的名称执行函数。

代码语言:javascript
复制
<?php
$result = myFunction();
$result = 'myFunction'(); // nonsense

但有些语言确实有办法解决这个问题:

代码语言:javascript
复制
<?php
$funcName = 'myFunction';
$result = $funcName();

在SQL中,您可以在将新的SQL查询作为字符串构建时使用表名来克服这一限制。然后在运行时准备并执行该SQL查询字符串。这称为动态SQL查询。

但是,就像上面使用变量存储函数名称的PHP示例一样,使用动态SQL需要多个步骤。不能将查询组合到使用结果的同一个查询中,以获取表名。

对于打开表名集的游标的存储过程,您的做法是正确的。但是,不能从存储过程中的动态SQL语句中打开游标。

在PHP或Python等脚本语言中,您可以很容易地使用动态SQL来完成所需的任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40729217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档