MySQL: объявить курсор для отображения таблиц? - PullRequest
1 голос
/ 15 февраля 2012

Я хочу написать сохраненный процесс, который перебирает все таблицы в моей базе данных и выполняет некоторые действия.

drop procedure if exists p2;

DELIMITER //

CREATE PROCEDURE `p2` ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
declare cur1 cursor for
    show tables from my_database_name
END//


call p2;

Это не работает;Я получаю сообщение о том, что у меня есть ошибка в синтаксисе SQL рядом с 'show tables from my_database_name'

Конечно, вместо того, чтобы делать show tables from my_database_name, я действительно хочу сказать show tables from database() или show tables from (select database()), ни один из которыхработа.

Помогите?Могу ли я сделать это в прямом SQL или мне нужно сначала вызвать show tables из моей программы, а затем повторить там набор результатов?Как я могу создать курсор для захвата значений таких вещей, как database() или show tables?

Ответы [ 2 ]

3 голосов
/ 18 августа 2013

Вот пример, который подсчитывает все ваши таблицы.

DELIMITER $$                                                                                                                                                                    

DROP PROCEDURE IF EXISTS procCountAllTables $$                                                                                                                                  

CREATE PROCEDURE procCountAllTables()                                                                                                                                           

BEGIN                                                                                                                                                                           
        DECLARE table_name VARCHAR(255);                                                                                                                                        
        DECLARE end_of_tables INT DEFAULT 0;                                                                                                                                    

        DECLARE cur CURSOR FOR                                                                                                                                                  
            SELECT t.table_name                                                                                                                                                 
            FROM information_schema.tables t                                                                                                                                    
            WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE';                                                                                                    
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1;                                                                                                           

        OPEN cur;                                                                                                                                                               

        tables_loop: LOOP                                                                                                                                                       
            FETCH cur INTO table_name;                                                                                                                                          

            IF end_of_tables = 1 THEN                                                                                                                                           
                LEAVE tables_loop;                                                                                                                                              
            END IF;                                                                                                                                                             

            SET @s = CONCAT('SELECT ''', table_name, ''', COUNT(*) AS Count FROM ' , table_name);                                                                               
            PREPARE stmt FROM @s;                                                                                                                                               
            EXECUTE stmt;                                                                                                                                                       

        END LOOP;                                                                                                                                                               

        CLOSE cur;                                                                                                                                                              
    END $$                                                                                                                                                                      

DELIMITER ;
3 голосов
/ 15 февраля 2012

show tables не является запросом SQL & mdash; это обрабатывается другим способом & mdash; но вы можете запросить таблицы в базе данных information_schema . Вам нужно что-то вроде SELECT table_name FROM <a href="http://dev.mysql.com/doc/refman/5.6/en/tables-table.html" rel="nofollow">information_schema.tables</a> WHERE table_schema='<b><i>db_name</i></b>'.

...