5.7. 动态或拼接语句

delimiter $$
CREATE PROCEDURE `show_description_all_tables`()
BEGIN
    DECLARE t_name VARCHAR(255) DEFAULT '';
    DECLARE done boolean DEFAULT TRUE;
        -- 定义游标
    DECLARE name_cursor CURSOR FOR
        SELECT table_name FROM information_schema.TABLES 
        WHERE table_schema='employees' AND table_type='base table';
    -- 定义结束条件
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=FALSE;
    -- 遍历查询所有
    OPEN name_cursor;
    -- 获取下一个表名
    FETCH name_cursor INTO t_name;
    WHILE done DO
        -- 获取创建信息
        SET @sql=CONCAT('show create table ',t_name,';');
        -- 预处理
        PREPARE order_sql FROM @sql;
        -- 执行
        EXECUTE order_sql;
        -- 获取下一个表名
        FETCH name_cursor INTO t_name;
    END WHILE;
    -- 释放资源
    DEALLOCATE PREPARE order_sql;
    CLOSE name_cursor;
    DROP TABLE table_result;
END$$
delimiter ;

注意

在 MySQL 中一般的SQL语句需要先编译然后立即执行,所以在存储过程中如果需要使用拼接SQL语句时需要先预处理在执行并且最终要释放资源。