mysql proc输出

jk9hmnmh  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(301)

我正在尝试在我的一个表的列上创建一些内容。我创建了一个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

当我将最后一条select语句移到循环中时,我可以看到stmt变量正在生成,但仍然以1329错误消息结束。
我尝试了coalesce而不是ifnull,显式地将变量stmt设置为“”,但是我一直得到这个奇怪的输出,也是打开的。我以为我在半小时内就完成了这个小程序,但是已经花了我半天的时间,我不知道出了什么问题。
不幸的是,托管proc的数据库具有不同的排序规则,因此使用了collate。除此之外,我不明白为什么这个代码不能运行。
欢迎任何指点。

ih99xse1

ih99xse11#

您可以尝试以下类似的查询。它得到一个类似于你的脚本的列表,但是没有循环。

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`

相关问题