AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 315508
Accepted
Chris
Chris
Asked: 2022-08-12 04:38:33 +0800 CST2022-08-12 04:38:33 +0800 CST 2022-08-12 04:38:33 +0800 CST

程序未正确循环

  • 772

我在一台服务器上有几个客户端数据库。它们都有一个前缀。为此,让我们使用“piggy_”作为前缀。

IE

piggy_client_a
piggy_client_b
piggy_client_c

下面是三个小猪数据库的代码并添加了一堆用户。(用于检测):

CREATE SCHEMA IF NOT EXISTS piggy_client_a;

CREATE TABLE piggy_client_a.user (
  id INT(11) NOT NULL AUTO_INCREMENT,
  fullname VARCHAR(30) DEFAULT NULL,
  email VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO piggy_client_a.user (fullname, email) VALUES
("chris davis", "chris@something.com"),
("chris td", "chris@something.com"),
("bob sinclair", "bob@spectrum.net"),
("frank sidebottom", "frank@bighead.com");

CREATE SCHEMA IF NOT EXISTS piggy_client_b;

CREATE TABLE piggy_client_b.user (
  id INT(11) NOT NULL AUTO_INCREMENT,
  fullname VARCHAR(30) DEFAULT NULL,
  email VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO piggy_client_b.user (fullname, email) VALUES
("fanny adams", "chris@elsewhere.net"),
("colin furry", "colin@something.com"),
("chris grumps", "grumpy@htom.com"),
("tracey singer", "trace@email.com");

CREATE SCHEMA IF NOT EXISTS piggy_client_c;

CREATE TABLE piggy_client_c.user (
  id INT(11) NOT NULL AUTO_INCREMENT,
  fullname VARCHAR(30) DEFAULT NULL,
  email VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO piggy_client_c.user (fullname, email)VALUES
("mary qos", "mary@comms.com"),
("curtis jackson", "curtis@something.com"),
("christine motor", "chrissy@live.net"),
("tom peters", "tom@peters.org");

每个 piggy 数据库中都有相同的模式。其中一个表是user,我想找到用户所在的任何这些数据库。

我写了一个存储过程,总体上它可以工作。然而,它只处理第一个小猪数据库。我已经仔细检查过,如果我将特定用户添加到piggy_client_c数据库中,它不会被返回。

这是我的代码:

DELIMITER $$
DROP PROCEDURE IF EXISTS `find_user`$$

CREATE PROCEDURE `find_user`(IN partial_name VARCHAR(20))
BEGIN

    DECLARE database_name VARCHAR(128) DEFAULT '';
    DECLARE non_found INTEGER DEFAULT 0;

    DECLARE database_list 
        CURSOR FOR 
            SELECT SCHEMA_NAME FROM information_schema.SCHEMATA 
            WHERE SCHEMA_NAME LIKE `piggy_client_%` 
            ORDER BY SCHEMA_NAME ASC;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET non_found = 1;

    OPEN database_list;

    check_table: LOOP

        FETCH database_list INTO database_name;

        IF non_found = 1 THEN 
            LEAVE check_table;
        END IF;

        SET @sql = CONCAT('SELECT "',database_name,'" AS db_name, fullname,email FROM ',database_name,'.user WHERE trim(fullname) like "%',partial_name,'%"');

        PREPARE db_statement FROM @sql;
        EXECUTE db_statement;
        DEALLOCATE PREPARE db_statement;

    END LOOP check_table;

    CLOSE database_list;

END$$

DELIMITER ;

我看不到任何会导致函数退出或不循环光标的东西,但我对此相当陌生。

或者,如果我可以“单步执行”代码,那将很有用,或者输出调试信息。

TIA,克里斯

mysql stored-procedures
  • 1 1 个回答
  • 45 Views

1 个回答

  • Voted
  1. Best Answer
    Lennart - Slava Ukraini
    2022-08-13T04:08:49+08:002022-08-13T04:08:49+08:00

    在您的代码中有一个错误:

    SELECT SCHEMA_NAME FROM information_schema.SCHEMATA 
    WHERE SCHEMA_NAME LIKE `piggy_client_%` 
    ORDER BY SCHEMA_NAME ASC;
    

    用字符串分隔符替换反引号,如下所示:

    SELECT SCHEMA_NAME FROM information_schema.SCHEMATA 
    WHERE SCHEMA_NAME LIKE 'piggy_client_%' 
    ORDER BY SCHEMA_NAME ASC;
    

    我创建了一个db-fiddle

    您还误用双引号作为字符串分隔符。您的插入语句应如下所示:

    ('fanny adams', 'chris@elsewhere.net'),
    

    但显然这有效,所以我还没有解决这个问题。

    • 3

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve