需求
存储过程需要传入排序列,升序或降序,然后查询所有记录
测试表
-- 创建表
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进行降序排列