登录
首页 > 服务器 > openGauss学习笔记-38 openGauss 高级数据管理-游标

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

发布时间:2023-08-13 19:54:42 发布用户: admin

Table of Contents
 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 ;
1.
2.
3.
通过已经创建的游标检索数据

FETCH [ direction { FROM | IN } ] cursor_name;
1.
其中direction子句为可选参数。

NEXT
   | PRIOR
   | FIRST
   | LAST
   | ABSOLUTE count
   | RELATIVE count
   | count
   | ALL
   | FORWARD
   | FORWARD count
   | FORWARD ALL
   | BACKWARD
   | BACKWARD count
   | BACKWARD ALL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
在不检索数据的情况下重新定位一个游标

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

MOVE [ direction [ FROM | IN ] ] cursor_name;
1.
其中direction子句为可选参数。

NEXT
   | PRIOR
   | FIRST
   | LAST
   | ABSOLUTE count
   | RELATIVE count
   | count
   | ALL
   | FORWARD
   | FORWARD count
   | FORWARD ALL
   | BACKWARD
   | BACKWARD count
   | BACKWARD ALL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
关闭游标,释放和一个游标关联的所有资源

CLOSE { cursor_name | ALL } ;
1.
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)
1.
2.
3.
4.
5.
6.
7.
8.
9.
用一个游标读取一个表。

--开始一个事务。
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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
用一个游标读取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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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

PHP更多>>

海关总署:我国进出口 连续2个月同比增长 长清区成功举办首届职工家政技能大赛 前妻要回土地于法有据 法院公允分割定分止争 G312线傅苦公路5标项目全幅顺利贯通 实现“56到84+”延伸,这个镇的文化中心为更多人群提供公共文化服务! 前11个月进出口持平 11月份同比增长1.2% 中国与新加坡签署中新自由贸易协定进一步升级议定书 凤阳奋力绘就宜居宜业和美乡村新画卷 浙江持续擦亮“一路先行”党建品牌 山东兖州:“一线支部工作法”将党旗插在田间地头 固安县加快推进 空天信息产业发展 王晓涛被开除党籍 濮阳王瑞林获评中国青年志愿者优秀个人 报中共中央批准,两“虎”同时受处分! 国务院:支持上海自贸试验区可信、安全和负责任地使用人工智能技术 把“东方美”传向国际市场!聊城这家小镇企业东盟市占率超70% 交通运输部关于发布《综合货运枢纽设计规范》等18项交通运输行业标准的公告 喜讯 | 贵州三力荣获“2021-2023年贵州省促进新型工业化发展先进企业”称号 内蒙古这起“百万黄金被盗案”,更多细节披露! 交通运输部印发《城市轨道交通通信系统运营技术规范(试行)》 黑龙江省政协原副主席曲敏,被“双开” 中老铁路磨憨口岸出入境人员突破10万人次 甘肃兰州榆中县:设立“零工驿站”提供就业服务 扶余:抢抓战略机遇,推动县域经济高质量发展 【“双争”进行时】霸州:百姓宣讲家乡事 强国复兴攀高峰 “山西一女性公职人员实名举报两任局长”,最新通报 海关总署:11月我国外贸进出口同比增长1.2% (人权行动看中国)河南驻马店:特色种植产业成农民增收好渠道 总投资74亿元!中国铁建中标海南临高金牌港开发区港口及配套工程项目 鼓励大学生基层就业还需多方向着力
Copyright 2018-2023 黑鸟云 版权所有  京ICP备2022032575号-3