首页 > 数据库 >实例详解数据库的游标管理

实例详解数据库的游标管理

时间:2024-02-26 10:13:42浏览次数:23  
标签:语句 实例 数据库 显式 游标 详解 SQL 隐式

本文分享自华为云社区《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数据库中,游标主要用于执行复杂的查询语句、处理多行数据以及进行数据操作等场景。游标的使用可以提高程序的灵活性和可维护性,并且可以减少不必要的内存消耗。使用游标,开发人员可以灵活地控制查询结果集的遍历顺序和处理方式,以满足不同的业务需求。

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:语句,实例,数据库,显式,游标,详解,SQL,隐式
From: https://www.cnblogs.com/huaweiyun/p/18033725

相关文章

  • 机器学习策略篇:详解正交化(Orthogonalization)
    正交化这是一张老式电视图片,有很多旋钮可以用来调整图像的各种性质,所以对于这些旧式电视,可能有一个旋钮用来调图像垂直方向的高度,另外有一个旋钮用来调图像宽度,也许还有一个旋钮用来调梯形角度,还有一个旋钮用来调整图像左右偏移,还有一个旋钮用来调图像旋转角度之类的。电视设计......
  • k8s-flannel网络详解
    1,网卡k8s安装完以后,查看k8s各node节点的网卡,会发现多了4个网卡docker0,flannel.1,cni0,veth,其中docker0纯粹是因为安装了docker服务才生成的网卡,和k8s集群是的逻辑架构没关系1.1docker0网卡docker0充当了一个网桥的功能,就是相当于一个集线器的功能,一个口收到信号......
  • 核心子方法1: prepareRefresh()方法详解
    1、设置容器的启动时间:this.startupDate=System.currentTimeMillis();2、设置活跃状态为true:this.closed.set(false);3、设置关闭状态为false:this.active.set(true);4、获取Environment对象,并加载当前系统的属性值到Environment对象中:getEnvironment().validateRequired......
  • 【KingbaseES】sys_restore命令详解及示例
    原文地址:https://blog.csdn.net/sinat_36528886/article/details/134491475【KingbaseES】sys_restore命令详解及示例一、概述二、语法一、概述sys_restore—从一个由sys_dump创建的归档文件恢复一个KingbaseES数据库sys_restore是一个用来从sys_dump创建的非文本格式......
  • 【转载】docker save load export import区别详解
    【转载】dockersaveloadexportimport区别详解https://www.cnblogs.com/dingjiaoyang/p/16571840.html1、dockersave用来将一个或多个image打包保存。如:将本地镜像库中的image1和image2打包到images.tar中dockersave-oimages.tagimage1:v1image2:v1dockersave也可......
  • 刘铁猛C#学习笔记12 参数种类详解
    一、值参数(传值参数、值传递)指参数的种类为值参数,而非参数数据类型为值类型1.值类型的传值参数类似一个新声明的局部变量,或传进来的实参的一个副本可以在方法体内重现赋值,但其在方法体内被赋值时,不会影响传进来的本体 2.引用类型的传值参数引用类型变量存储的是实例......
  • pip install 命令详解
    pipinstall命令用于安装Python包,支持从多种源安装包1.通过pipinstall-h命令查看帮助文档总共包括:1.usage2. Description3. InstallOptions4. PackageIndexOptions5. GeneralOptions: 1.用法(usage):Usage:pipinstall[options]<requirementspecifie......
  • 刘铁猛C#学习笔记4 方法详解
    方法的由来C++中用两个冒号访问命名空间如:std::cout<<"Hello,World!";“方法”是一个面向对象的概念,当一个函数作为类的成员出现时,就被称之为方法方法也可以称作“成员函数”C++中对类的声明放在.h文件中,而类的定义放在.cpp文件中c#中类的声明和定义是放在一起的 C+......
  • 刘铁猛C#学习笔记5 操作符详解1
      一.操作符的优先级此表格中从上往下操作符优先级依次降低,上面的操作符优先级更高,更先运算 提升优先级的方法可以通过加圆括号的方式,提高表达式的运算优先级圆括号可嵌套 同优先级的运算顺序同一行操作符运算优先级相同,优先级相同时大部分按照从左向右的顺序依......
  • 刘铁猛C#学习笔记6 操作符详解2
    —————基本操作符———————1.checked与unchecked用于检测一个值在内存中是否溢出Checked:告诉编译器要检查溢出Unchecked:告诉编译器不用检查溢出使用在值变量前,若内存溢出,则编译器会出现以下弹窗ex:try与catch(待补充)  Unchecked是C#语言默认采用的模式,......