0
点赞
收藏
分享

微信扫一扫

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语句执行_存储过程


举报

相关推荐

0 条评论