Проверьте, присутствуют ли таблицы в базе данных - хранимая процедура - MySQL

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

call tableCheck('MyDatabase', 'table1 table20 table3')

Таким образом, процедура будет проверять эти таблицы (с разделителями-пробелами). У меня есть код ниже, но у меня проблемы с проверкой других таблиц, он читает первую, но не вторую или третью. ТАК, что мой код не зацикливается и не читает следующее слово.

PROCEDURE `tableCheck` (db VARCHAR(256), db_tables VARCHAR(256))
BEGIN   
DECLARE tbl, tbls VARCHAR(256); 
DECLARE c INT DEFAULT 0;

SET tbls = db_tables;

    WHILE c = 0 DO

        #split word
        SET tbl = SUBSTRING_INDEX(tbls," ",1);
        #go to next string
        SET tbls = SUBSTR(tbls,LENGTH(tbl)+1);

        #check every table
        SELECT table_name AS 'Table Name'
        FROM INFORMATION_SCHEMA.TABLES  
        WHERE table_schema=db AND table_name=tbl;

        IF tbls = 0 THEN 
            SET c = 1;
        END IF;
    END WHILE;
END

person Jim    schedule 30.09.2015    source источник
comment
Если ваши таблицы не начинаются с чисел, tbls = 0 всегда будет истинным.   -  person Uueerdo    schedule 30.09.2015
comment
Я вижу, что он всегда закрывается после первого цикла. Поэтому я должен найти другой способ закрыть петлю. @Uueerdo   -  person Jim    schedule 30.09.2015
comment
Вы можете сделать свой тест примерно таким tbls REGEXP '[a-zA-Z]+'   -  person Uueerdo    schedule 30.09.2015
comment
Я пробовал разные варианты этого, но тот же результат, либо сразу закрывается цикл, либо идет бесконечный @Uueerdo   -  person Jim    schedule 01.10.2015


Ответы (1)


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

Используя функцию dbo.fnArray из этой ссылки, вы сможете присоединиться к INFORMATION_SCHEMA.TABLES следующим образом:

create procedure dbo.spCheckTable @db varchar(256), @tbls varchar(8000)
as
begin
    select * 
      from INFORMATION_SCHEMA.TABLES i
     inner join dbo.fnArray(@tbls, ' ') t on i.TABLE_NAME = t.arrValue
     where i.TABLE_CATALOG = @db
end

Теперь это хранимая процедура

person ewahner    schedule 30.09.2015
comment
Ах, я понимаю, что вы делаете, но я хочу избежать использования функций. Я хочу сохранить все это в одной хранимой процедуре - person Jim; 30.09.2015
comment
Обновлено мое решение, теперь это хранимая процедура. Не уверен, почему вы хотите избежать функций. Большинство людей стремятся реализовать принципы DRY и другие шаблоны. - person ewahner; 01.10.2015