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

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

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

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()):不管汉字还是数字或者是字母都算是一个字符。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值