openGauss学习笔记-38 openGauss 高级数据管理-游标

news2025/1/11 14:24:05

文章目录

    • openGauss学习笔记-38 openGauss 高级数据管理-游标
      • 38.1 语法格式
      • 38.2 参数说明
      • 38.3 示例

openGauss学习笔记-38 openGauss 高级数据管理-游标

为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。

38.1 语法格式

  • 定义游标

    CURSOR cursor_name
        [ BINARY ]  [ NO SCROLL ]  [ { WITH | WITHOUT } HOLD ]
        FOR query ;
    
  • 通过已经创建的游标检索数据

    FETCH [ direction { FROM | IN } ] cursor_name;
    

    其中direction子句为可选参数。

    NEXT
       | PRIOR
       | FIRST
       | LAST
       | ABSOLUTE count
       | RELATIVE count
       | count
       | ALL
       | FORWARD
       | FORWARD count
       | FORWARD ALL
       | BACKWARD
       | BACKWARD count
       | BACKWARD ALL
    
  • 在不检索数据的情况下重新定位一个游标

    MOVE的作用类似于FETCH命令,但只是重定位游标而不返回行。

    MOVE [ direction [ FROM | IN ] ] cursor_name;
    

    其中direction子句为可选参数。

    NEXT
       | PRIOR
       | FIRST
       | LAST
       | ABSOLUTE count
       | RELATIVE count
       | count
       | ALL
       | FORWARD
       | FORWARD count
       | FORWARD ALL
       | BACKWARD
       | BACKWARD count
       | BACKWARD ALL
    
  • 关闭游标,释放和一个游标关联的所有资源

    CLOSE { cursor_name | ALL } ;
    

38.2 参数说明

  • cursor_name

    将要创建、关闭的游标名。

  • BINARY

    指明游标以二进制而不是文本格式返回数据。

  • NO SCROLL

    声明游标检索数据行的方式。

    • NO SCROLL:声明该游标不能用于以倒序的方式检索数据行。
    • 未声明:根据执行计划的不同,自动判断该游标是否可以用于以倒序的方式检索数据行。
  • WITH HOLD | WITHOUT HOLD

    声明当创建游标的事务结束后,游标是否能继续使用。

    • WITH HOLD:声明该游标在创建它的事务结束后仍可继续使用。
    • WITHOUT HOLD:声明该游标在创建它的事务之外不能再继续使用,此游标将在事务结束时被自动关闭。
    • 如果不指定WITH HOLD或WITHOUT HOLD,默认行为是WITHOUT HOLD。
    • 跨节点事务不支持WITH HOLD(例如在多DBnode部署openGauss中所创建的含有DDL的事务属于跨节点事务)。
  • query

    使用SELECT或VALUES子句指定游标返回的行。

    取值范围:SELECT或VALUES子句。

  • direction_clause

    定义抓取数据的方向。

    取值范围:

    • NEXT(缺省值)

      从当前关联位置开始,抓取下一行。

    • PRIOR

      从当前关联位置开始,抓取上一行。

    • FIRST

      抓取查询的第一行(和ABSOLUTE 1相同)。

    • LAST

      抓取查询的最后一行(和ABSOLUTE -1相同)。

    • ABSOLUTE count

      抓取查询中第count行。

      ABSOLUTE抓取不会比用相对位移移动到需要的数据行更快,因为下层的实现必须遍历所有中间的行。

      count取值范围:有符号的整数

      • count为正数,就从查询结果的第一行开始,抓取第count行。
      • count为负数,就从查询结果末尾抓取第abs(count)行。
      • count为0时,定位在第一行之前。
    • RELATIVE count

      从当前关联位置开始,抓取随后或前面的第count行。

      取值范围:有符号的整数

      • count为正数就抓取当前关联位置之后的第count行。
      • count为负数就抓取当前关联位置之前的第abs(count)行。
      • 如果当前行没有数据的话,RELATIVE 0返回空。
    • count

      抓取随后的count行(和FORWARD count一样)。

    • ALL

      从当前关联位置开始,抓取所有剩余的行(和FORWARD ALL一样)。

    • FORWARD

      抓取下一行(和NEXT一样)。

    • FORWARD count

      从当前关联位置开始,抓取随后或前面的count行。

    • FORWARD ALL

      从当前关联位置开始,抓取所有剩余行。

    • BACKWARD

      从当前关联位置开始,抓取前面一行(和PRIOR一样) 。

    • BACKWARD count

      从当前关联位置开始,抓取前面的count行(向后扫描)。

      取值范围:有符号的整数

      • count为正数就抓取当前关联位置之前的count行。
      • count为负数就抓取当前关联位置之后的abs(count)行。
      • 如果有数据的话,BACKWARD 0重新抓取当前行。
    • BACKWARD ALL

      从当前关联位置开始,抓取所有前面的行(向后扫描) 。

  • { FROM | IN } cursor_name

    使用关键字FROM或IN指定游标名称。

    取值范围:已创建的游标的名称。

  • ALL

    关闭所有已打开的游标。

38.3 示例

假设存在表customer_t1 ,数据内容如下:

openGauss=# SELECT * FROM customer_t1;
 c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------
          3769 |               | Grace        |             |
          3769 | hello         |              |             |
          6885 | maps          | Joes         |             |   2200
          4321 | tpcds         | Lily         |             |   3000
          9527 | world         | James        |             |   5000
(5 rows)
  • 用一个游标读取一个表。

    --开始一个事务。
    openGauss=# START TRANSACTION;
    START TRANSACTION
    
    --建立一个名为cursor1的游标。
    openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1;
    DECLARE CURSOR
    
    --抓取前3行到游标cursor1里。
    openGauss=# FETCH FORWARD 3 FROM cursor1;
     c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    ---------------+---------------+--------------+-------------+--------
              3769 |               | Grace        |             |
              3769 | hello         |              |             |
              6885 | maps          | Joes         |             |   2200
    (3 rows)
    
    --关闭游标并提交事务。
    openGauss=# CLOSE cursor1;
    CLOSE CURSOR
    
    --结束一个事务。
    openGauss=# END;
    COMMIT
    
  • 用一个游标读取VALUES子句中的内容。

    --开始一个事务。
    openGauss=# START TRANSACTION;
    START TRANSACTION
    
    --建立一个名为cursor2的游标。
    openGauss=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1;
    DECLARE CURSOR
    
    --抓取前2行到游标cursor2里。
    openGauss=# FETCH FORWARD 2 FROM cursor2;
     column1 | column2
    ---------+---------
           0 |       3
           1 |       2
    (2 rows)
    
    --关闭游标并提交事务。
    openGauss=# CLOSE cursor2;
    CLOSE CURSOR
    
    --结束一个事务。
    openGauss=# END;
    COMMIT
    
  • WITH HOLD游标的使用。

    --开启事务。
    openGauss=# START TRANSACTION;
    
    --创建一个with hold游标。
    openGauss=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM customer_t1;
    
    --抓取头2行到游标cursor1里。
    openGauss=# FETCH FORWARD 2 FROM cursor1;
     c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    ---------------+---------------+--------------+-------------+--------
              3769 |               | Grace        |             |
              3769 | hello         |              |             |
    (2 rows)
    
    --结束事务。
    openGauss=# END;
    COMMIT
    
    --抓取下一行到游标cursor1里。
    openGauss=# FETCH FORWARD 1 FROM cursor1;
     c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    ---------------+---------------+--------------+-------------+--------
              6885 | maps          | Joes         |             |   2200
    (1 row)
    
    --关闭游标。
    openGauss=# CLOSE cursor1;
    CLOSE CURSOR
    
  • MOVE语句的使用。

    --开始一个事务。
    openGauss=# START TRANSACTION;
    START TRANSACTION
    
    --定义一个名为cursor1的游标。
    openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1;
    DECLARE CURSOR
    
    --忽略游标cursor1的前3行。
    openGauss=# MOVE FORWARD 1 FROM cursor1;
    MOVE 1
    
    --抓取游标cursor1的前2行。
    openGauss=# FETCH 2 FROM cursor1;
     c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    ---------------+---------------+--------------+-------------+--------
              3769 | hello         |              |             |
              6885 | maps          | Joes         |             |   2200
    (2 rows)
    
    --关闭游标。
    openGauss=# CLOSE cursor1;
    CLOSE CURSOR
    
    --结束一个事务。
    openGauss=# END;
    COMMIT
    

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

图片

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

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

相关文章

【Pytroch】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于决策树算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 决策树是一种常用的机器学习算法,用于分类和回归任务。它通过树状结构表示数据的决策…

Opencv4基于C++的 实时人脸检测

文章目录: 一:环境配置搭建(VS2015Opencv4.6) 二:下资源文件 第一种:本地生成 第二种 直接下载 三:代码展示 窗口布局 main.cpp test.h test.cpp 效果图◕‿◕✌✌✌:opencv人脸识别效果图(请叫我真爱粉) 一&…

运算器组成实验

1.实验目的及要求 实验目的 1、熟悉双端口通用寄存器组的读写操作。 2、熟悉运算器的数据传送通路。 3、验证运算器74LS181的算术逻辑功能。 4、按给定数据,完成指定的算术、逻辑运算。 实验要求 1、做好实验预习。掌握运算器的数据传送通路和ALU的功能特性&…

7.3.tensorRT高级(2)-future、promise、condition_variable

目录 前言1. 生产者消费者模式2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-future、promise…

【算法——双指针】LeetCode 1089 复写零

千万不要被这道题标注着“简单”迷惑了,实际上需要注意的细节很多。 题目描述: 解题思路: 正序遍历,确定结果数组的最后一个元素所在的位置;知道最后一个元素的位置后倒序进行填充。 先找到最后一个需要复写的数 先…

C++ 泛型编程:函数模板

文章目录 前言一、什么是泛型编程二、函数模板三、函数模板的使用四、多参数函数模板五,示例代码:总结 前言 当需要编写通用的代码以处理不同类型的数据时,C 中的函数模板是一个很有用的工具。函数模板允许我们编写一个通用的函数定义&#…

php从静态资源到动态内容

1、从HTML到PHP demo.php:后缀由html直接改为php,实际上当前页面已经变成了动态的php应用程序脚本 demo.php: 允许通过<?php ... ?>标签,添加php代码到当前脚本中 php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析 <!DOCTYPE html>…

Qt中将信号封装在一个继承类中的方法

QLabel标签类对应的信号如下&#xff1a; Qt中标签是没有双击&#xff08;double Click&#xff09;这个信号的&#xff1b; 需求一&#xff1a;若想双击标签使其能够改变标签中文字的内容&#xff0c;那么就需要自定义一个“双击”信号&#xff0c;并将其封装在QLabel类的派生…

使用vscode写vue文件代码有时不提示

背景&#xff1a; 安装了volar插件&#xff0c;但是在vue文件中导入js文件代码不提示&#xff0c;准确来说是有时提示有时不提示 解决方案&#xff1a; 插件冲突&#xff0c;卸载 JavaScript (ES6) code snippets 插件&#xff0c;这个插件在vue文件中适配不是很好。 很有可能…

【正版系统】2023热门短剧SAAS版开源 | 小程序+APP+公众号H5

当我们在刷百度、D音、K手等各种新闻或短视频时经常会刷到剧情很有吸引力的短剧广告&#xff0c;我们点击广告链接即可进入短剧小程序&#xff0c;小程序运营者通过先免费看几集为诱耳然后在情节高潮时弹出充值或开VIP会员才能继续看的模式来赚钱&#xff0c;以超级赘婿、乡村小…

电影数据可视化综合分析

数据可视化&分析实战 1.1 沈腾参演电影数据获取 1.2 电影数据可视化分析 目录 数据可视化&分析实战前言1. 数据认知2. 数据可视化2.1 解决matplotlib不能绘制中文字符的问题2.2 折线图2.3 柱状图绘制2.4 箱线图绘制2.5 饼图 3. Na值处理及相关性分析3.1 相关性分析3.2…

2023.08.13 学习周报

文章目录 摘要文献阅读1.题目2.要点3.问题4.解决方案5.本文贡献6.方法6.1 特征选择6.2 时间序列平稳性检测与数据分解6.3 基于GRU神经网络的PM2.5浓度预测 7.实验7.1 网络参数7.2 实验结果7.3 对比实验 8.讨论9.结论10.展望 PINNS模型1.自动微分2.全连接神经网络3.PINNs模型的P…

NavMeshPlus 2D寻路插件

插件地址:h8man/NavMeshPlus&#xff1a; Unity NavMesh 2D Pathfinding (github.com) 我对Unity官方是深恶痛觉,一个2D寻路至今都没想解决,这破引擎早点倒闭算了. 这插件是githun的开源项目,我本身是有写jps寻路的,但是无法解决多个单位互相阻挡的问题(可以解决但是有性能问…

Yolov5(一)VOC划分数据集、VOC转YOLO数据集

代码使用方法注意修改一下路径、验证集比例、类别名称&#xff0c;其他均不需要改动&#xff0c;自动划分训练集、验证集、建好全部文件夹、一键自动生成Yolo格式数据集在当前目录下&#xff0c;大家可以直接修改相应的配置文件进行训练。 目录 使用方法&#xff1a; 全部代码…

Window停止更新操作

在这里插入图片描述

Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

我们在做Android平台RTMP推送和GB28181设备对接的时候&#xff0c;遇到这样的问题&#xff0c;有的设备&#xff0c;麦克风采集出来的audio&#xff0c;音量过高或过低&#xff0c;特别是有些设备&#xff0c;采集到的麦克风声音过低&#xff0c;导致播放端听不清前端采集的aud…

1216. 验证回文字符串 III;764. 最大加号标志;1135. 最低成本联通所有城市

1216. 验证回文字符串 III 核心思想&#xff1a;动态规划&#xff0c;这题需要一个思路的转换&#xff0c;删除最多k个字符判断是否为回文串&#xff0c;就相当于问你子序列中最长的回文串的长度是否比n-k长,就将这题转换为了最长回文子序列。 764. 最大加号标志 核心思想&am…

前后端分离------后端创建笔记(03)前后端对接(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Shader 编程:三角形、矩形等多边形绘制

该原创文章首发于微信公众号&#xff1a;字节流动 未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 SDF 有向距离场 上节其实牵扯到 SDF 算法&#xff0c;因为后面涉及高级特效的时候会经常用到&#xff0c;这里先提前对它做个简单的介…

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区&#xff0c;因为当前地域下的可用区可能不支持备案&#xff0c;阿里云百科分享提醒大家&#xff0c;如果你的购买的云服务器搭建网站应用&#xff0c;网站域名需要使用这台云服务器备案的话&#xff0c;不要随机分配可用区&…