Mysql查询结果用表注释当做表头

存储过程语句如下,可直接复制使用

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,数据库,存储过程)