MySQL-游标

游标介绍

  • 游标能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构
  • 在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针
  • MySQL中游标可以在存储过程和函数中使用
  • 使用游标的过程中,会对数据行进行加锁 ,这样在业务并发量大的时候,不仅会影响业务之间的效率,还会消耗系统资源,造成内存不足

游标使用

1. MySQL,SQL Server,DB2 和 MariaDB 声明游标

  • select_statement 代表的是SELECT 语句,返回一个用于创建游标的结果集
DECLARE cursor_name CURSOR FOR select_statement;

2. Oracle 或者 PostgreSQL 声明游标

DECLARE cursor_name CURSOR IS select_statement;

3. 声明示例

DECLARE cur_emp CURSOR FOR
SELECT employee_id,salary FROM employees;

DECLARE cursor_fruit CURSOR FOR
SELECT f_name, f_price FROM fruits ;

4. 打开游标

  • 使用游标,必须先打开游标。
  • 打开游标的时候 SELECT 语句的查询结果集就会送到游标工作区
OPEN cursor_name

5. 使用游标

  • 使用 cursor_name 这个游标来读取当前行,并且将数据保存到 var_name 这个变量中,游
    标指针指到下一行
  • 如果游标读取的数据行有多个列名,则在 INTO 关键字后面赋值给多个变量名即可
  • var_name必须在声明游标之前就定义好
  • 游标查询结果集中的字段数,必须跟 INTO 后面的变量数一致,否则,在存储过程执行的时
    候,MySQL 会提示错误
FETCH cursor_name INTO var_name [, var_name] ...

6. 关闭游标

  • 游标会占用系统资源 ,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率
  • 关闭游标之后,我们就不能再检索查询结果中的数据行,如果需要检索只能再次打开游标
CLOSE cursor_name

游标示例

DELIMITER //

CREATE PROCEDURE get_count_by_limit_total_salary(
                        IN limit_total_salary DOUBLE,
                        OUT total_count INT)
BEGIN
    DECLARE sum_salary DOUBLE DEFAULT 0; #记录累加的总工资
    DECLARE cursor_salary DOUBLE DEFAULT 0; #记录某一个工资值
    DECLARE emp_count INT DEFAULT 0; #记录循环个数

    #定义游标
    DECLARE emp_cursor CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
    #打开游标
    OPEN emp_cursor;

    REPEAT
        #使用游标(从游标中获取数据)
        FETCH emp_cursor INTO cursor_salary;
        SET sum_salary = sum_salary + cursor_salary;
        SET emp_count = emp_count + 1;

        UNTIL sum_salary >= limit_total_salary
    END REPEAT;

    SET total_count = emp_count;
    #关闭游标
    CLOSE emp_cursor;
END //

DELIMITER ;

MySQL 8.0的新特性—全局变量的持久化

  • 使用SET GLOBAL语句设置的变量值只会临时生效。 数据库重启后,服务器又会从MySQL配置文件中读取变量的默认值
  • MySQL 8.0版本新增了 SET PERSIST命令,将该命令的配置保存到数据目录下的        mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖默认的配置文件
SET GLOBAL MAX_EXECUTION_TIME=2000;
SET PERSIST global max_connections = 1000;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值