首页 > 数据库 >SQL SERVER 从入门到精通 第5版 第三篇 高级应用 第12章 游标的使用 读书笔记

SQL SERVER 从入门到精通 第5版 第三篇 高级应用 第12章 游标的使用 读书笔记

时间:2024-04-30 19:34:37浏览次数:14  
标签:salary 读书笔记 -- 游标 SERVER cursor employee DECLARE

 第十二章 游标的使用

  >.游标的概述

  游标是一种数据库对象,用于在SQL中处理(SELECT的)查询结果集。它允许逐行地访问查询结果集的数据,以进行一系列操作,如更新、删除或插入数据。游标通常用于存储过程或触发器中,用于对数据进行逐行处理。通过游标,可以实现对结果集的逐行处理,可以方便地进行数据处理和操作。游标在数据库中的使用可能会导致性能问题,应该谨慎使用。

  >.游标的实现

  一个完整的游标由五个部分组成,并且遵循以下顺序:

    1.声明游标

    2.打开游标

    3.使用游标

    4.关闭游标

    5.释放游标

  >.游标的类型

    >.静态游标

      静态游标的结果集是保存在tempdb中的,相当于是对原数据的一个快照,只读,不能对原数据进行修改.不能看到数据的更新. 特点: 只读,消耗资源少,适用于数据量不大且不需要频繁更新的情况。

 

    >.动态游标

      与静态游标相反,动态游标是可读写的,它会反映出用户对结果集所做的所有修改,包括增删改.特点:读写,消耗资源多,适用于需要频繁更新的情况。

    >.只进游标

      静态游标和动态游标都是可以前后滚动的,而只进游标只能向前滚动游标,不能在结果集中反向移动。一旦过了记录,就无法再次检索。注意:只进游标除了不能向后移动,其他的基本上与动态游标无异,也就是说,它是可读写基础表数据的!

    >.键集驱动游标

      键集驱动游标介于静态游标与动态游标之间.换句话说就是,它同时具备了静态游标与动态游标的部分特点.当打开游标时,该游标中的成员以及行的顺序是固定的,键集在游标打开时也会存储到tempdb中,对非键集列的数据值的更改在用户游标滚动的时候可以看见,在游标打开以后对数据库中插入的行是不可见的,除非关闭重新打开游标.适用于需要对游标进行大量查找和跳跃的情况。

  >.游标的基本操作

    >.声明游标    
--语法:DECLARE 游标名称 CURSOR FOR + SELECT语句
--例如:
DECLARE cursor_name CURSOR FOR
SELECT column1, column2, ...
FROM table_name
WHERE condition;

举例一:

假设我们有一个名为"employees"的表,包含员工的ID、姓名和薪水字段。我们需要计算员工的总薪水并输出每位员工的姓名和对应的总薪水。

-- 创建一个存储过程
CREATE PROCEDURE calculate_total_salary
AS
BEGIN
    -- 声明游标
    DECLARE employee_cursor CURSOR FOR
    SELECT name, salary
    FROM employees;

    DECLARE @name NVARCHAR(50); -- 声明一个变量用于存储员工姓名
    DECLARE @salary INT; -- 声明一个变量用于存储员工薪水
    DECLARE @total_salary INT = 0; -- 初始化总薪水为0

    -- 打开游标
    OPEN employee_cursor;

    -- 获取数据
    FETCH NEXT FROM employee_cursor INTO @name, @salary; -- 尝试获取第一行数据
    WHILE @@FETCH_STATUS = 0 -- 当能够获取数据时执行循环
    BEGIN
        SET @total_salary = @total_salary + @salary; -- 累计总薪水
        PRINT 'Employee ' + @name + ' total salary is ' + CAST(@salary AS NVARCHAR(10)); -- 打印每位员工的姓名和总薪水

        FETCH NEXT FROM employee_cursor INTO @name, @salary; -- 尝试获取下一行数据
    END

    -- 关闭游标
    CLOSE employee_cursor;
    DEALLOCATE employee_cursor;

    PRINT 'Total salary of all employees is ' + CAST(@total_salary AS NVARCHAR(10)); -- 打印所有员工的总薪水
END

举例二:

    声明游标时,可以在SELECT语句的末尾加FOR关键字,对游标内的数据进行限制,比如

--前面是声明一个游标,SELECT语句后面的For将对数据进行约束
DECLARE employee_cursor CURSOR FOR
SELECT EmployeeID, Name, Department
FROM Employee
ORDER BY EmployeeID
--FOR READ ONLY;   -- 声明游标并限制数据为只读
--FOR update;   -- 更新游标
    >.打开游标
OPEN mycurcor;    --局部游标
OPEN GLOBAL mycurcor;    --GLOBAL 表示指定mycurcor游标为全局游标

如果使用INSENSITIV或者STATIC选项声明了游标,那么 OPEN将创建一个临时表来保存结果集.如果结果集中任意行的大小超过SQL SERVER表的最大行大小,OPEN将失败..另外:游标选项 FOR UPDATE 和 INSENSITIVE 有冲突,不能共存。

-- 声明一个游标并使用 INSENSITIVE 选项
DECLARE employee_cursor INSENSITIVE CURSOR FOR
SELECT EmployeeID, Name, Department
FROM Employee
ORDER BY EmployeeID;

-- 打开游标,创建临时表保存结果集
OPEN employee_cursor;
  >.读取游标中的数据(略,见上面示例)
  >.关闭游标(略,见上面示例)
  >.释放游标(略,见上面示例)

>.使用系统过程查看游标

  >.sp_cursor_list
  >.sp_describe_cursor

 

标签:salary,读书笔记,--,游标,SERVER,cursor,employee,DECLARE
From: https://www.cnblogs.com/yoooos/p/18168035

相关文章

  • 在 .net core 3.1 的 docker 镜像生成的容器中,连接 sql server 2008 r2 版本的数据库,
    错误1:{"ClassName":"System.Data.SqlClient.SqlException","Message":"Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthepre-loginhandshake.(provider:TCPProvider,......
  • 国内独家|阿里云瑶池发布ClickHouse企业版:云原生Serverless新体验
    日前,阿里云联合ClickHouseInc.成功举办了「ClickHouse企业版商业化发布会」。阿里云ClickHouse企业版是阿里云和ClickHouse原厂独家合作的存算分离的云原生版本,支持资源按需弹性Serverless,在帮助企业降低成本的同时,为企业带来更多商业价值。 在发布会上,阿里云数据库产品事业部......
  • Windows Server 下 IIS 申请部署 Let's Encrypt 证书实现 免费 HTTPS
    certbot命令行搞了半天一直失败找到个工具Certify简单方便1、首先下载Certify下载到服务器上并安装。下载地址:https://certifytheweb.com/2、第一次启动程序时会弹出对话框让我们填写个邮箱地址,等证书快要过期的时候我们会收到续订证书的提醒邮件。这里我们填上常用的ema......
  • 云原生k8s史上最详细 云原生 serverless
    Serverless是云计算发展的产物,其实不管是云计算还是云原生,亦或者是Serverless架构,他具体是什么,都是很难说得清的,但是这并不影响我们对Serverless架构的理解。一、心智层面去服务器化:专业的事情交给更专业的人,开发者可以更关注于自身业务逻辑字面解释Server和less的:就是将更少的......
  • SQL Server实战三:数据库表完整性约束及索引、视图的创建、编辑与删除
      本文介绍基于MicrosoftSQLServer软件,实现数据库表完整性约束、索引与视图的创建、编辑与删除等操作的方法。目录1交互式为数据库表S创建PRIMARYKEY约束2交互式创建数据库表TEST_SC,创建PRIMARYKEY约束3T-SQL创建数据库表T的PRIMARYKEY约束4T-SQL创建数据库表TEST_C,以......
  • SQL SERVER 从入门到精通 第5版 第三篇 高级应用 第11章 触发器 读书笔记
     第11章触发器>.概述触发器是一种特殊类型的存储过程.当指定表中的数据发生变化时触发器自动生效.它与表紧密相连,可以看作表定义的一部分.触发器不能通过名称被直接调用,更不允许设置参数.在SQLSERVER中,一张表可以有多个触发器.用户可以使用INS......
  • springboot连接sqlserver2008r2 驱动版本问题。
    <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>8.2.2.jre8</version></dependency>版本比较常见的:8.4.1.jre8最新的提示:9......
  • java 数据库编程(一)JDBC连接Sql Server数据库
    java数据库编程(一)JDBC连接SqlServer数据库一、JDBC简介java数据库连接技术(JavaDatabaseConnection,JDBC)是由java提供的一组与平台无关的数据库的操作标准,其本身由一类与接口组成,并且在操作中将按照严格的顺序执行。由于数据库属于资源操作,所以所有的数据库操作的最后必......
  • Mysql、Oracle、SqlServer的JDBC连接实现和对比(提供驱动包)
    Mysql、Oracle、SqlServer的JDBC连接实现和对比(提供驱动包)首先,我们需要准备数据库连接所需的jar包。目前mysql的驱动包可能比较好找,但是oracle和sqlserver的有很多,要找到能用的要花一点点心思,这里直接把下载地址和版本发送出来。Mysql:驱动程序包:mysql-connector-java-5.1.3......
  • winscp/putty 免密登录linux server
    参考 puttyWinScp免密登录远程Linux 原理生成一对公钥和私钥,私钥以文件的形式保存在本地,公钥保存在远程机器上,一般是/home/users/username/.ssh/authorized_keys。这样每次登录只需指定私钥文件,远程机器通过比对公钥和私钥来验证登录的合法性第一步:生成公钥/私钥双击putt......