首页 > 其他分享 >openGauss 游标

openGauss 游标

时间:2024-04-28 10:02:37浏览次数:21  
标签:count -- 游标 抓取 cursor1 openGauss

游标

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

语法格式

  • 定义游标

    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 } ;
    

参数说明

  • 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

    关闭所有已打开的游标。

示例

假设存在表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
    

标签:count,--,游标,抓取,cursor1,openGauss
From: https://www.cnblogs.com/renxyz/p/18163053

相关文章

  • openGauss 语法
    语法默认情况下,数据库安装成功,登录后,可以使用\help语句查看所有openGauss的SQL语法。openGauss=#\helpAvailablehelp:ABORTALTERTABLECREATEDATABASECREATETEXTSEARCHCONFIGURATIONDROPOPE......
  • openGauss 数据类型
    数据类型数值类型表1列出了所有的可用类型。表1整数类型名称描述存储空间范围TINYINT微整数,别名为INT1。1字节0~255SMALLINT小范围整数,别名为INT2。2字节-32,768~+32,767INTEGER常用的整数,别名为INT4。4字节-2,147,483,648~+2,14......
  • openGauss 索引
    索引索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引:经常执行查询的字段。在连接条件上创建索引,对于存在多字段连接的查询,建议......
  • openGauss 锁
    锁如果需要保持数据库数据的一致性,可以使用LOCKTABLE来阻止其他用户修改表。例如,一个应用需要保证表中的数据在事务的运行过程中不被修改。为实现这个目的,则可以对表进行锁定,这样将防止数据不被并发修改。LOCKTABLE只在一个事务块的内部有用,在事务结束时就会被释放。语法格......
  • openGauss MOT-SQL覆盖和限制
    MOTSQL覆盖和限制MOT设计几乎能够覆盖SQL和未来特性集。例如,大多数支持标准的PostgresSQL,也支持常见的数据库特性,如存储过程、自定义函数等。下面介绍各种SQL覆盖和限制。不支持的特性MOT不支持以下特性:跨引擎操作:不支持跨引擎(磁盘+MOT)的查询、视图或事务。计划于2021年实......
  • openGauss MOT-VACUUM清理
    MOTVACUUM清理使用VACUUM进行垃圾收集,并有选择地分析数据库,如下所示。【openGauss】在openGauss中,VACUUM用于回收死元组占用的存储空间。在正常的openGauss操作中,删除的元组或因更新而作废的元组不会从表中物理删除。只能由VACUUM清理。因此,需要定期执行VACUUM,特别是在频繁......
  • openGauss dblink
    dblinkdblink是一个可以在一个openGauss数据库会话中连接到其它openGauss数据库的工具,同libpq支持的连接参数一致,可参考链接参数。openGauss默认不编译dblink,下面依次介绍如何编译和使用dblink。编译dblink当前dblink的源码放在contrib/dblink目录中。在编译安装完openGauss数......
  • openGauss file_fdw
    file_fdwfile_fdw模块提供了外部数据封装器file_fdw,可以用来在服务器的文件系统中访问数据文件。数据文件必须是COPYFROM可读的格式,具体请参见COPY的介绍。使用file_fdw访问的数据文件是当前可读的,不支持对该数据文件的写入操作。当前openGauss会默认编译file_fdw,initdb的时候......
  • openGauss Foreign-Data-Wrapper
    ForeignDataWrapperopenGauss的FDW(ForeignDataWrapper)可以实现各个openGauss数据库及远程服务器(包括数据库、文件系统)之间的跨库操作。目前支持的远程数据库类型包括Oracle、Mysql(MariaDB)、openGauss(postgres_fdw)、file_fdw、dblink。用于Oracle的外部数据包装器mysql_......
  • openGauss MOT-SILO增强特性
    MOTSILO增强特性SILO[对比:磁盘与MOT]凭借其基本算法流程,优于我们在研究实验中测试的许多其他符合ACID的OCC算法。然而,为了使SILO成为产品级机制,我们必须用许多在最初设计中缺失的基本功能来增强它,例如:新增对交互式事务的支持,其中事务的SQL运行在客户端实现,而不是作为服务器端......