第21课 SQL入门之使用游标

文章目录

  • 21.1 游标
  • 21.2 使用游标
    • 21.2.1 创建游标
    • 21.2.2 使用游标
    • 21.2.3 关闭游标

这一课将讲授什么是游标,如何使用游标。

21.1 游标

SQL检索操作返回一组称为结果集的行,这组返回的行都是与SQL语句相匹配的行(零行或多行)。简单地使用SELECT语句,没有办法得到第一行、下一行或前10行。但这是关系DBMS功能的组成部分。

结果集(result set)
SQL查询所检索出的结果。

有时,需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

说明:具体DBMS的支持
Microsoft Access不支持游标,所以本课的内容不适用于Microsoft Access。
MySQL 5已经支持存储过程。因此,本课的内容不适用MySQL较早的版本。
SQLite支持的游标称为步骤(step),本课讲述的基本概念适用于SQLite的步骤,但语法可能完全不同。

不同的DBMS支持不同的游标选项和特性。常见的一些选项和特性如下。

  • 能够标记游标为只读,使数据能读取,但不能更新和删除。
  • 能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)。
  • 能标记某些列为可编辑的,某些列为不可编辑的。
  • 规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。
  • 指示DBMS对检索出的数据(而不是指出表中活动数据)进行复制,使数据在游标打开和访问期间不变化。
    游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。
    说明:游标与基于Web的应用
    游标对基于Web的应用(如ASP、ASP.NET、ColdFusion、PHP、Python、Ruby、JSP等)用处不大。虽然游标在客户端应用和服务器会话期间存在,但这种客户/服务器模式不适合Web应用,因为应用服务器是数据库客户端而不是最终用户。所以,大多数Web应用开发人员不使用游标,他们根据自己的需要重新开发相应的功能。

21.2 使用游标

使用游标涉及几个明确的步骤:

  • 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句和游标选项。
  • 一旦声明,就必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
  • 对于填有数据的游标,根据需要取出(检索)各行。
  • 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的DBMS)。
    声明游标后,可根据需要频繁地打开和关闭游标。在游标打开时,可根据需要频繁地执行取操作。

21.2.1 创建游标

使用DECLARE语句创建游标,这条语句在不同的DBMS中有所不同。DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。为了说明,我们创建一个游标来检索没有电子邮件地址的所有顾客,作为应用程序的组成部分,帮助操作人员找出空缺的电子邮件地址。
下面是创建此游标的DB2、MariaDB、MySQL和SQL Server版本:
输入▼

DECLARE CustCursor CURSOR 
FOR 
SELECT * 
FROM Customers 
WHERE cust_email IS NULL 

下面是Oracle和PostgreSQL版本:
输入▼

DECLARE CURSOR CustCursor 
IS 
SELECT * 
FROM Customers 
WHERE cust_email IS NULL 

分析▼
在上面两个版本中,DECLARE语句用来定义和命名游标,这里为CustCursor。SELECT语句定义一个包含没有电子邮件地址(NULL值)的所有顾客的游标。
定义游标之后,就可以打开它了。

21.2.2 使用游标

使用OPEN CURSOR语句打开游标,这条语句很简单,在大多数DBMS中的语法相同:
输入▼

OPEN CURSOR CustCursor 

分析▼
在处理OPEN CURSOR语句时,执行查询,存储检索出的数据以供浏览和滚动。
现在可以用FETCH语句访问游标数据了。FETCH指出要检索哪些行,从何处检索它们以及将它们放于何处(如变量名)。第一个例子使用Oracle语法从游标中检索一行(第一行):
输入▼

DECLARE TYPE CustCursor IS REF CURSORRETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPEBEGIN     OPEN CustCursor;     FETCH CustCursor INTO CustRecord;     CLOSE CustCursor; END; 

分析▼
在这个例子中,FETCH用来检索当前行(自动从第一行开始),放到声明的变量CustRecord中。对于检索出来的数据不做任何处理。
下一个例子(也使用Oracle语法)中,从第一行到最后一行,对检索出来的数据进行循环:
输入▼

DECLARE TYPE CustCursor IS REF CURSORRETURN Customers%ROWTYPE; 
DECLARE CustRecord Customers%ROWTYPE 
BEGINOPEN CustCursor;     LOOP     FETCH CustCursor INTO CustRecord;     EXIT WHEN CustCursor%NOTFOUND;     ...     END LOOP;     CLOSE CustCursor; 
END; 

分析▼
与前一个例子一样,这个例子使用FETCH检索当前行,放到一个名为CustRecord的变量中。但不一样的是,这里的FETCH位于LOOP内,因此它反复执行。代码EXIT WHEN CustCursor%NOTFOUND使在取不出更多的行时终止处理(退出循环)。这个例子也没有做实际的处理,实际例子中可用具体的处理代码替换占位符…。
下面是另一个例子,这次使用Microsoft SQL Server语法:
输入▼

DECLARE @cust_id CHAR(10), @cust_name CHAR(50),         @cust_address CHAR(50),         @cust_city CHAR(50),         @cust_state CHAR(5),         @cust_zip CHAR(10),         @cust_country CHAR(50),        @cust_contact CHAR(50),         @cust_email CHAR(255) OPEN CustCursor FETCH NEXT FROM CustCursor INTO @cust_id, @cust_name,@cust_address, @cust_city, @cust_state, @cust_zip,@cust_country, @cust_contact, @cust_email WHILE @@FETCH_STATUS = 0 BEGIN  FETCH NEXT FROM CustCursor         INTO @cust_id, @cust_name, @cust_address,              @cust_city, @cust_state, @cust_zip,              @cust_country, @cust_contact, @cust_email END CLOSE CustCursor 

分析▼
在此例中,为每个检索出的列声明一个变量,FETCH语句检索一行并保存值到这些变量中。使用WHILE循环处理每一行,条件WHILE @@FETCH_STATUS = 0在取不出更多的行时终止处理(退出循环)。这个例子也不进行具体的处理,实际代码中,应该用具体的处理代码替换其中的…占位符。

21.2.3 关闭游标

如前面几个例子所述,游标在使用完毕时需要关闭。此外,SQL Server等DBMS要求明确释放游标所占用的资源。下面是DB2、Oracle和PostgreSQL的语法:
输入▼

CLOSE CustCursor 

下面是Microsoft SQL Server的版本:
输入▼

CLOSE CustCursor 
DEALLOCATE CURSOR CustCursor 

分析▼
CLOSE语句用来关闭游标。一旦游标关闭,如果不再次打开,将不能使用。第二次使用它时不需要再声明,只需用OPEN打开它即可。


上一篇:第20课 SQL入门之管理事务处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备份至关重要!如何解决iCloud的上次备份无法完成的问题

将iPhone和iPad备份到iCloud对于在设备发生故障或丢失时确保数据安全至关重要。但iOS用户有时会收到一条令人不安的消息,“上次备份无法完成。”下面我们来看看可能导致此问题的原因,如何解决此问题,并使你的iCloud备份再次顺利运行。 这些故…

技术分享-Jenkins

持续集成及Jenkins介绍 软件开发生命周期叫SDLC(Software Development Life Cycle),集合了计划、开发、测试、部署过程。 在平常的开发过程中, 需要频繁地(一天多次)将代码集成到主干,这个叫持…

闭包 闭包理解 闭包的应用实例

闭包 形成闭包的条件&#xff1a;一个函数访问外部的变量就形成了闭包 用闭包的好处&#xff1a; (1)可以通过闭包函数形成独立实例的变量 (2)不会造成全局污染 代码调试&#xff0c;演示闭包形成过程 <script> //函数内部访问外部的变量&#xff0c;就形成了闭包functi…

Leetcode 406 根据身高重建队列

题意理解&#xff1a; people [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] 给定一个二维数组&#xff0c;&#xff08;h,k&#xff09;h表示此人身高&#xff0c;k表示前面有几个人比他高。 我们按照每个人的h,k两个维度的需求给每个人排在合适的位置。 如&#xff1a; [5,0][7,0]…

深入浅出堆排序: 高效算法背后的原理与性能

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;堆排序一个基于二叉堆数据结构的排序算法&#xff0c;其稳定性和排序效率在八大排序中也…

ctfshow sql 195-200

195 堆叠注入 十六进制 if(preg_match(/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\|\"|select|union|or|and|\x26|\x7c|file|into/i, $username)){$ret[msg]用户名非法;die(json_encode($ret));}可以看到没被过滤&#xff0c;select 空格 被过滤了&#xff0c;可…

深入解析 C 语言中的神秘代码:(*(void (*)())0)();

在本文中&#xff0c;我们将深入研究一行神秘的 C 代码 (*(void (*)())0)();&#xff0c;探讨它的结构、潜在风险以及可能的应用场景&#xff0c;并通过拓展和实例让读者更容易理解。 (*(void (*)())0)(); //(void (*)() -- 函数指针类型 //把0强制转换成void(*)()函数指针类型…

制造行业定制软件解决方案——工业信息采集平台

摘要&#xff1a;针对目前企业在线检测数据信号种类繁多&#xff0c;缺乏统一监控人员和及时处置措施等问题。蓝鹏测控开发针对企业工业生产的在线数据的集中采集分析平台&#xff0c;通过该工业信息采集平台可将企业日常各种仪表设备能够得到数据进行集中分析处理存储&#xf…

VM——计算流程执行耗时

1、计算同一个流程内的耗时&#xff0c;可以直接用“耗时统计”模块&#xff1b; 2、计算多个流程的运行耗时&#xff0c;需要使用“脚本”&#xff0c;利用C#函数计算耗时 首先&#xff0c;记录起始时间&#xff0c;保存到string类型的全局变量中&#xff0c; curTmStr Dat…

C++之深拷贝和浅拷贝

目录 浅拷贝 深拷贝 赋值运算符重载的深拷贝 在学习C类和对象时我们学习了浅拷贝&#xff0c;本期我们将再次回顾浅拷贝并为大家讲述深拷贝的概念。 浅拷贝 在学习类和对象时我们学习了拷贝构造函数的概念&#xff0c;而且我们也知道&#xff0c;因为拷贝构造函数属于类的默…

Go后端开发 -- 环境搭建

Go后端开发 – 环境搭建 文章目录 Go后端开发 -- 环境搭建一、环境配置二、IDE的选择三、使用go mod构建项目1.初始化项目2.添加依赖项3.运行项目 四、环境报错1.VS Code中gopls报错 一、环境配置 Go官网下载地址&#xff1a;https://golang.org/dl/ https://go.dev/dl/ Go官方…

JavaWeb笔记之前端开发JQuery

一、引言 1.1 概述 jQuery是一个快速、简洁的JavaScript代码库。jQuery设计的宗旨是“Write Less&#xff0c;Do More”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事情。它封装JavaScript常用的功能代码&#xff0c;提供一种简便的 JavaScript操作方式&#xff0c…

Sass:提升CSS开发效率的利器

Sass&#xff1a;提升CSS开发效率的利器 导语&#xff1a;在Web开发中&#xff0c;样式表是不可或缺的一部分。然而&#xff0c;纯CSS编写繁琐且冗长&#xff0c;难以维护和管理。为了解决这些问题&#xff0c;CSS预处理器应运而生&#xff0c;而其中最为知名和强大的就是Sass…

麒麟V10 ARM 离线生成RabbitMQ docker镜像并上传Harbor私有仓库

第一步在外网主机执行&#xff1a; docker pull arm64v8/rabbitmq:3.8.9-management 将下载的镜像打包给离线主机集群使用 在指定目录下执行打包命令&#xff1a; 执行&#xff1a; docker save -o rabbitmq_arm3.8.9.tar arm64v8/rabbitmq:3.8.9-management 如果懒得打包…

Spring + SpringBoot史上最全的注解说明

Spring中的注解 Spring中的注解大概可以分为两大类&#xff1a; spring的bean容器相关的注解&#xff0c;或者说bean工厂相关的注解&#xff1b;springmvc相关的注解。 spring的bean容器相关的注解&#xff0c;先后有&#xff1a;Required&#xff0c; Autowired, PostConst…

国产低成本Wi-Fi SoC解决方案芯片ESP8266与ESP8285对比差异

目录 ESP8266与ESP8285对比差异微信号&#xff1a;dnsj5343ESP8285简介ESP8285 主要特性Wi-Fi特性射频模块CPU特性硬件软件 ES8285 8266通用开发板 ESP8266与ESP8285对比差异 ESP8285相当于在ESP8266基础上多加了1/2MB Flash&#xff0c; ESP8285与ESP8266同用一套SDK&#xf…

落叶归根:递归思想在二叉树叶子节点类问题中的妙用

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、递归的介绍二、递归算法的妙用2.1 二叉树结点个数2.2 二叉树叶子结点个数2.3 二叉树第k层结点个数2.4 二叉树…

一些CSS的笔记

1.margin margin:0 auto 是指上下的值为0&#xff0c;左右的值为auto&#xff1b; margin:auto是指上右下左的值全都auto&#xff0c;即都是自适应的&#xff1b; margin:0; 这个是上右下左的值都为0&#xff1b; 2.vertical-align vertical-align 属性设置元素的垂直对齐方式。…

基于比较的排序算法总结(java实现版)

目录 什么是基于比较的排序算法 什么是排序算法的稳定性 基础排序算法的稳定性 插入排序法 希尔排序法 冒泡排序法 总结 高级算法的稳定性 快速排序法 堆排序法 归并排序法 总结 注意 什么是基于比较的排序算法 基于比较的排序算法定义&#xff1a;之所以能给元素…

安装gnvm,nodejs,npm使用方法

安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址&#xff1a; https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录&#xff0c;如&#xff1a;d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…