我正在尝试在其中一个表的列上创建一些东西。我创建了一个带有奇怪输出的mysql proc。过程:
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。除此之外,我不明白为什么这段代码不会运行。
非常欢迎任何指示。
答案 0 :(得分:0)
您可以尝试类似以下的查询。它会得到一个像你的脚本一样的列表,但没有循环。
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`