MySQL proc странный вывод - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать что-то в столбцах одной из моих таблиц. Я создал процесс MySQL, который идет со странным выводом. Процесс:

create procedure test (
   in in_database varchar(255),
   in in_table varchar(255))
begin
   declare done            int default false;
   declare stmt            text default '';
   declare var_column_name varchar(64);
   declare var_data_type   varchar(64);

   declare
      cur_cols cursor
   for
      select
         column_name,data_type
      from
         information_schema.columns 
      where
         table_schema = in_database collate utf8_general_ci 
      and
         table_name = in_table collate utf8_general_ci
      order  by
         ordinal_position asc;

   set done = false;

   open cur_cols;
   colsloop: loop
      fetch cur_cols
      into
         var_column_name,
         var_data_type;

      if done then
         leave colsloop;
      end if;

      set stmt = concat(ifnull(stmt,''),':',ifnull(var_column_name,''));

   end loop;
   close cur_cols;

   select stmt;

end$$

Довольно просто: добавление имен столбцов в переменную и по окончании вывод результата на консоль. Когда я запускаю тестирование, моя процедура выглядит следующим образом:

call test('mysql','columns_priv');

Я получаю

Error Code: 1329 (02000): No data - zero rows fetched, selected, or processed

Когда я перемещаю последний оператор выбора в цикл, я вижу, что переменная stmt накапливается, но все еще заканчивается в сообщении об ошибке 1329.

Я пробовал COALESCE вместо IFNULL, явно устанавливая переменную stmt в '', но я продолжаю получать этот странный вывод, также включенный. Я думал, что создаю этот небольшой утилиты за полчаса, но это уже стоило мне полдня, и я не знаю, что происходит не так.

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

Любые указатели приветствуются.

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете попробовать запрос, подобный следующему. Он получает список, подобный вашему сценарию, но без зацикливания.

SELECT 
    `TABLE_NAME`,
    GROUP_CONCAT(DISTINCT `COLUMN_NAME` ORDER BY `ORDINAL_POSITION` SEPARATOR ':') as `column_list`
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_NAME` like '%assets%'
GROUP BY `TABLE_NAME`
...