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进行降序排列

运行结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值