GaussDB数据库SQL系列-游标管理
目录
一、前言
在数据库中,游标(cursor)是一种非常重要的工具,用于在数据库查询结果集中进行定位和操作。游标提供了一种在多行数据结果集中逐行处理每一行的机制,允许开发人员对每一行的数据进行操作,如检索、过滤、修改等。本文将结合GaussDB数据库,简单的给大家做一介绍。
二、概述(GaussDB)
1、游标概述
在GaussDB数据库中,为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。
2、游标的使用分类
游标的使用分为显式游标和隐式游标。对于不同的SQL语句,游标的使用情况不同。
序号 | SQL语句 | 游标 |
1 | 结果是多行的查询语句 | 显式的 |
2 | 非查询语句 | 隐式的 |
3 | 结果是单行的查询语句 | 隐式 / 显式 |
- 显式游标:显式游标主要用于对查询语句的处理,尤其是在查询结果为多条记录的情况下。
- 隐式游标:对于非查询语句,如修改、删除操作,则由系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名称为SQL,这是由系统定义的。
- 游标循环:游标在WHILE语句、LOOP语句中的使用称为游标循环,一般这种循环都需要使用OPEN、FETCH和CLOSE语句。
三、GaussDB中的显式游标(示例)
1、显式游标的使用与操作步骤
- 第一步,定义(声明)游标:定义一个游标名,以及与其相对应的SELECT语句。
- 第二步,打开游标:执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN语句还将锁定数据库表中游标结果集合对应的数据行。
- 第三步,提取游标数据:检索结果集合中的数据行,放入指定的输出变量中。
- 第四步,对该记录进行处理。
- 第五步,继续处理,直到活动集合中没有记录。
- 第六步,关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH语句获取其中数据。关闭后的游标可以使用OPEN语句重新打开。
2、显式游标示例
--给工资大于等于20000的员工降薪500。 --复制一张测试表 CREATE TABLE company2 AS TABLE company1; CREATE OR REPLACE PROCEDURE cursor_p() AS DECLARE v_id NUMBER(6); v_salary NUMBER(8,2); CURSOR c1 IS SELECT id, salary FROM company2; BEGIN OPEN c1; LOOP FETCH c1 INTO v_id, v_salary; EXIT WHEN c1%NOTFOUND; IF v_salary>=20000 THEN UPDATE company2 SET salary =salary - 500 WHERE id = v_id; END IF; END LOOP; CLOSE c1; END; / --执行存储过程 CALL cursor_p(); --查看,比对结果变化 SELECT t2.*,t1.salary as "降薪前" FROM company2 t2 LEFT JOIN company1 t1 ON t2.id=t1.id ORDER BY ID ASC;
游标属性说明:
%NOTFOUND是游标的属性之一,用于控制程序流程或者了解程序的状态。此处的意思是,当最近的DML(数据操作语言)操作(如INSERT,UPDATE,DELETE等)没有影响任何行时,该属性为真。也就是说,如果对表执行的操作没有找到任何匹配的行,那么这个属性就会为真,'EXIT WHEN c1%NOTFOUND;' 就会执行。
执行结果:
四、GaussDB中的隐式游标(示例)
1、隐式游标简介
对于隐式游标的操作,如定义、打开、取值及关闭操作,都由系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是最新处理的一条SQL语句所包含的数据,与用户自定义的显式游标无关。
2、隐式游标示例
--创建临时表,删除已离职的员工Allen,如果Allen已经不存在,则新增一条新员工信息(重名) CREATE TABLE company3 AS TABLE company1; CREATE OR REPLACE PROCEDURE cursor_p1() AS DECLARE v_name VARCHAR(10) := 'Allen'; BEGIN DELETE FROM company3 WHERE name = v_name; --根据游标状态做进一步处理 IF SQL%NOTFOUND THEN INSERT INTO company3 VALUES(4,v_name,24,'China',30000); END IF; END; / --执行 CALL cursor_p1(); --查看,比对执行结果 SELECT *, 'company1' as "company1" FROM company1 WHERE NAME ='Allen' union all SELECT *, 'company3' as "company3" FROM company3 WHERE NAME ='Allen'
游标属性说明:
SQL%NOTFOUND 是GaussDB数据库中的一个属性,用于检查最近的 SQL 语句是否对数据库没有任何影响。如果 SQL 语句没有找到任何匹配的记录,那么这个属性就为真。所以,本段SQL中的IF SQL%NOTFOUND THEN 这一行代码的意思是:如果最近的 SQL 语句没有找到任何匹配的记录,那么就执行后续的代码。通常,这个语句用于处理 SQL 查询可能找不到数据的情况。
执行结果:
五、小结
在GaussDB数据库中,游标主要用于执行复杂的查询语句、处理多行数据以及进行数据操作等场景。游标的使用可以提高程序的灵活性和可维护性,并且可以减少不必要的内存消耗。使用游标,开发人员可以灵活地控制查询结果集的遍历顺序和处理方式,以满足不同的业务需求。
——结束

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
飞码LowCode前端技术系列(一):数据结构设计 | 京东云技术团队
简介 飞码是京东科技研发的低代码产品,可使营销运营域下web页面快速搭建。飞码是单web页面搭建工具,从创建页面到监测再到投产的一站式解决方案。会通过七篇文章介绍飞码,分别是:(1)背景与数据结构设计,(2)如何便捷配置出页面-1,(3)如何便捷配置出页面-2,(4)如何便捷配置出页面-3,(5)如何便捷配置出页面-4,(6)如何便捷快速验证实现投产及飞码探索,(7)飞码画布的设计。 一、背景与分析 营销域下web页面逻辑复杂、接口多、UI要求较高等特性。在复杂业务下使用ProCode需要较多调试与自测才可以达到业务期望值。飞码的目标是从ProCode到LowCode,再到NoCode。如何使用LowCode或NoCode赋能营销域下的场景,飞码认为需要从以下两个大方面解决。 1、 如何便捷配置出web页面(编辑态) 1-1、 数据源(接口):便捷数据源配置、同时也支持复杂数据源扩展能力 1-2、 组件:如何用低代码能力快速创建组件;如何快速集成第三方组件;组件与平台是解耦;组件的属性、样式、数据、事件可以定制化配置。 1-3、 模板:不同页面之间有相同的区域可以进行便捷抽取为模板;飞...
- 下一篇
从基础到实践,回顾Elasticsearch 向量检索发展史
本文分享自华为云社区《Elasticsearch向量检索的演进与变革:从基础到应用》,作者: 汀丶。 1.引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象(例如文本、图像或声音)转换为数值向量,并在多维空间中进行相似性搜索,它能够实现高效的查询匹配和推荐。 Elasticsearch 作为一款流行的开源搜索引擎,其在向量检索方面的发展也一直备受关注。本文将回顾 Elasticsearch 向量检索的发展历史,重点介绍各个阶段的特点和进展。以史为鉴,方便大家建立起 Elasticsearch 向量检索的全量认知。 2. 初步尝试:简单向量检索的引入 Elasticsearch 最初并未专门针对向量检索进行设计。然而,随着机器学习和人工智能的兴起,对于高维向量空间的查询需求逐渐增长。 在 Elasticsearch 的 5.x 版本中,Elastic 爱好者们开始尝试通过插件和基本的数学运算实现简单的向量检索功能。如:一些早期的插件如 elasticsearch-vector-scoring、fast-elasticsearch-vector-scoring 就是为了...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装Nodejs环境