存储过程语句如下,可直接复制使用
CREATE PROCEDURE `test0`(IN `t_name` varchar(255))
BEGIN
-- 定义字段名
DECLARE ecolumn_name varchar(255) ;
-- 定义字段注释
DECLARE ecolumn_comment varchar(255) ;
-- 定义执行语句
declare tempsql varchar(400) default '';
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 定义游标
DECLARE c_job CURSOR FOR select column_name, column_comment
from information_schema.`COLUMNS` WHERE upper(TABLE_NAME) = upper(t_name);
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN c_job;
-- 遍历
read_loop: LOOP
-- 取出相应字段
FETCH NEXT from c_job INTO ecolumn_name,ecolumn_comment;
-- 结束循环体
IF done THEN
LEAVE read_loop;
END IF;
-- 拼接sql语句
set tempsql := concat(tempsql , ecolumn_name, ' ', ecolumn_comment ,',');
END LOOP;
-- 关闭游标
CLOSE c_job;
-- 处理查询字段最后多出的一个逗号
set tempsql := SUBSTRING(tempsql,1,CHAR_LENGTH(tempsql)-1);
-- 拼写查询语句
set tempsql := concat('select ',tempsql,' from ',t_name,'');
set @fsql = tempsql;
-- 预处理动态sql语句
prepare fl from @fsql;
-- 执行sql语句
execute fl;
-- 释放prepare
deallocate prepare fl;
END
另外
我在写这个存储过程时遇到几个坑,这里说明一下,也算新手排雷了
1 定义执行语句的变量
declare tempsql varchar(400) default '';
在定义执行语句变量时要给它一个默认值,否则会导致变量始终为null。
我最开始是这么写的
declare tempsql varchar(400);
结果在
set tempsql := concat(tempsql , ecolumn_name, ' ', ecolumn_comment ,',');
tempsql为空。
2 mysql字符串长度函数
length():计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符。
char_length()):不管汉字还是数字或者是字母都算是一个字符。

本文介绍了如何使用MySQL存储过程,将表注释作为查询结果的表头。在编写过程中,作者遇到了变量初始化和字符串长度函数的问题。通过存储过程,可以避免tempsql变量为空,并解析了length()与char_length()函数在计算字符串长度时的区别。
534

被折叠的 条评论
为什么被折叠?



