MySQL笔记:存储过程中动态构造SQL语句执行

需求

存储过程需要传入排序列,升序或降序,然后查询所有记录

测试表

-- 创建表
CREATE TABLE `test`.`student` (
  `id` INT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `age` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

-- 插入数据
INSERT INTO `student`
VALUES( NULL, 'aaa', 15),
	(NULL,'bbb', 16),
	(NULL, 'ccc',15),
	(NULL, 'ddd', 13);

PREPARE Statement

因为要动态构造SQL,所以要使用PREPARE Statement

PREPARE语法
PREPARE stmt_name FROM preparable_stmt

stmt_name: 语句变量名。
preparable_stmt: 语句,可以是sql字面字符串,也可以是存储sql语句的用户变量。但只能包含单条sql语句,不支持多条。
因为PREPARE Statement是会话级的,所以preparable_stmt不能是函数或存储过程中的参数或局部变量。

缩写存储过程

CREATE PROCEDURE `select_by_order` (
	IN strOrderBy VARCHAR(32), -- 根据此列进行排序
    IN isAsc TINYINT -- 是否升序
)
BEGIN
	-- PREPARE Statement是会话级,不能使用函数或存储过程中的参数或局部变量
	-- DECLARE strSql VARCHAR(256);
    
    -- 动态构造sql语句
    SET @strSql = 'SELECT * FROM `student`';
    IF strOrderBy != "" THEN
		SET @strSql = CONCAT( @strSql, ' ORDER BY ', strOrderBy);
        IF isAsc = 1 THEN
			SET @strSql = CONCAT( @strSql, ' ASC');
		ELSE
			SET @strSql = CONCAT( @strSql, ' DESC');
		END IF;
	END IF;
    
    -- 使用PREPARE Statements执行动态的sql语句
    -- 因为PREPARE Statement不支持多条sql, 所有strSql只能包含单条
    PREPARE stmt FROM @strSql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

调用存储过程

CALL select_by_order("age",0); -- 按age进行降序排列

运行结果

MySQL笔记:存储过程中动态构造SQL语句执行_第1张图片

你可能感兴趣的:(数据库,PREPARE,动态构造SQL)