Mysql 存储过程

Mysql 存储过程,mysql,stored-procedures,Mysql,Stored Procedures,我一直在谷歌上寻找答案,但什么也找不到。我有一个游标语句,用于提取数据库中存在的表的名称 目标是: 具有两个参数的存储过程,即database1和database2 比较两个数据库并输出差异。 数据库名称以制表符/空格分隔 BEGIN DECLARE done INT DEFAULT FALSE; DECLARE db_tables VARCHAR(256); DECLARE cursor1 CURSOR FOR SELECT TABLE_NAME, TABLE_SCHEMA

我一直在谷歌上寻找答案,但什么也找不到。我有一个游标语句,用于提取数据库中存在的表的名称

目标是: 具有两个参数的存储过程,即database1和database2 比较两个数据库并输出差异。 数据库名称以制表符/空格分隔

BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE db_tables VARCHAR(256);

DECLARE cursor1 CURSOR FOR 
        SELECT TABLE_NAME, TABLE_SCHEMA
        FROM information_schema.tables  
        WHERE TABLE_SCHEMA = db1
        AND TABLE_TYPE = 'BASE TABLE';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor1;
FETCH cursor1 into db_tables;

WHILE done = FALSE DO
SET query1 = SELECT * FROM db1 WHERE table1 IN(table_name);
END WHILE;
CLOSE cursor1;

END

这使用了
信息\u模式。表
信息

模式 询问 结果 这意味着表
s1
在数据库
db1
中,但不在
db2
中,表
s4
在数据库
db2
中,但不在
db1

存储过程 测试它:
调用showdbiffintablenames('x1','x2')

相同的结果

t1
t2
只是表别名。请参阅手册页。从手册页面:

下面的列表描述了在使用时要考虑的一般因素 书写连接

表引用可以使用tbl_名称作为别名或 tbl_名称别名_名称:

如果提前知道要查找两个或多个表,我几乎从不编写没有别名的查询。它减少了打字的工作量。它们在自联接(到同一个表)中尤其常见。您需要一种方法来区分要处理的是哪一个,以从查询中删除不明确的错误。这就是为什么那个别名在那里。另外,您会注意到该表在两次之后消失


有两种方法可以编写它,如上面的粉红色/桃色块所示。

这使用了
信息\u模式。表
信息

模式 询问 结果 这意味着表
s1
在数据库
db1
中,但不在
db2
中,表
s4
在数据库
db2
中,但不在
db1

存储过程 测试它:
调用showdbiffintablenames('x1','x2')

相同的结果

t1
t2
只是表别名。请参阅手册页。从手册页面:

下面的列表描述了在使用时要考虑的一般因素 书写连接

表引用可以使用tbl_名称作为别名或 tbl_名称别名_名称:

如果提前知道要查找两个或多个表,我几乎从不编写没有别名的查询。它减少了打字的工作量。它们在自联接(到同一个表)中尤其常见。您需要一种方法来区分要处理的是哪一个,以从查询中删除不明确的错误。这就是为什么那个别名在那里。另外,您会注意到该表在两次之后消失



有两种方法可以编写它,如上面的粉红色/桃色方框所示。

您刚刚给了我们一个规范,要求我们编写,ya knowSO不是免费的编码服务。你是一名程序员(据说),你需要自己编写程序。如果你不能让它工作,发布你尝试过的东西,我们会帮你修复。哦,对不起,我不是这个意思,我有一些代码,并在这里输入@drew。我只需要一些方向和想法来解决这个问题。有点迷路了。@barmar抱歉,这是非常原始的,这就是为什么我没有放置它,但我用代码更新了帖子。听起来不错。向我们展示两个模式。以及现在的预期产量。所以我们知道输出差异意味着什么,你刚刚给了我们一个规范要求我们编写,你知道这不是一个免费的编码服务。你是一名程序员(据说),你需要自己编写程序。如果你不能让它工作,发布你尝试过的东西,我们会帮你修复。哦,对不起,我不是这个意思,我有一些代码,并在这里输入@drew。我只需要一些方向和想法来解决这个问题。有点迷路了。@barmar抱歉,这是非常原始的,这就是为什么我没有放置它,但我用代码更新了帖子。听起来不错。向我们展示两个模式。以及现在的预期产量。因此,我们知道输出差异的意思。哇,你做得很快,是的,我会试着把它转换成一个存储过程。所以,使用光标不是一个好主意?我在底部做了一个s.p。做一个复习,非常感谢,如果你不介意的话,问一个问题。T1是一个变量吗?不知道那是从哪里来的。例如,“来自信息\模式表t1”。那句话让我很困惑,我很乐意
t1
是一个表
alias
。修改了答案的底部。因为我很懒,所以我没有把
作为t1
作为t2
,对此我深表歉意。好运气,汉克斯,抓住你了!这非常有帮助!你就是那个人@drewOh哇,你做得这么快,是的,我会试着看看我是否能把它转换成一个存储过程。所以,使用光标不是一个好主意?我在底部做了一个s.p。做一个复习,非常感谢,如果你不介意的话,问一个问题。T1是一个变量吗?不知道那是从哪里来的。例如,“来自信息\模式表t1”。那句话让我很困惑,我很乐意
t1
是一个表
alias
。修改了答案的底部。因为我很懒,所以我没有把
作为t1
作为t2
,对此我深表歉意。好运气,汉克斯,抓住你了!这非常有帮助!你就是那个人@画
create database db1;
create database db2;

create table db1.s1 (id int);
create table db1.s2 (id int);
create table db1.s3 (id int);

create table db2.s2 (id int);
create table db2.s3 (id int);
create table db2.s4 (id int);
select t1.table_name, 2 as 'not in this one'
from INFORMATION_SCHEMA.TABLES t1
where t1.table_schema='db1'
and not exists (select * from INFORMATION_SCHEMA.TABLES t2 where t2.table_schema='db2' and t2.table_name=t1.table_name)
union
select t1.table_name, 1 as 'not in this one'
from INFORMATION_SCHEMA.TABLES t1
where t1.table_schema='db2'
and not exists (select * from INFORMATION_SCHEMA.TABLES t2 where t2.table_schema='db1' and t2.table_name=t1.table_name)
+------------+-----------------+
| table_name | not in this one |
+------------+-----------------+
| s1         |               2 |
| s4         |               1 |
+------------+-----------------+
delimiter $$
create procedure showDBDiffInTableNames
( x1 varchar(40),x2 varchar(40) )
BEGIN
    -- 
    -- passed parameters, x1 is a string containing the name of a database
    -- x2 is a string containing the name of another database
    --
    select t1.table_name, 2 as 'not in this one'
    from INFORMATION_SCHEMA.TABLES t1
    where t1.table_schema=x1
    and not exists (select * from INFORMATION_SCHEMA.TABLES t2 where t2.table_schema=x2 and t2.table_name=t1.table_name)
    union
    select t1.table_name, 1 as 'not in this one'
    from INFORMATION_SCHEMA.TABLES t1
    where t1.table_schema=x2
    and not exists (select * from INFORMATION_SCHEMA.TABLES t2 where t2.table_schema=x1 and t2.table_name=t1.table_name);
END
$$
DELIMITER ;