更新时间:2024-08-14 GMT+08:00
分享

FETCH

功能描述

FETCH通过已创建的游标来检索数据。

每个游标都有一个供FETCH使用的关联位置。游标的关联位置可以在查询结果的第一行之前,或者在结果中的任意行,或者在结果的最后一行之后:

  • 游标刚创建完之后,关联位置在第一行之前。
  • 在抓取了一些移动行之后,关联位置在检索到的最后一行上。
  • 如果FETCH抓取完了所有可用行,它就停在最后一行后面,或者在反向抓取的情况下是停在第一行前面。
  • FETCH ALL或FETCH BACKWARD ALL总是把游标的关联位置放在最后一行或者在第一行前面。

注意事项

  • 如果游标定义了NO SCROLL,则不允许使用例如FETCH BACKWARD之类的反向抓取。
  • NEXT,PRIOR,FIRST,LAST,ABSOLUTE,RELATIVE形式在恰当地移动游标之后抓取一条记录。如果后面没有数据行,就返回一个空的结果,此时游标就会停在查询结果的最后一行之后(向后查询时)或者第一行之前(向前查询时)。
  • FORWARD和BACKWARD形式在向前或者向后移动的过程中抓取指定的行数,然后把游标定位在最后返回的行上;或者,如果count大于可用的行数,则在所有行之后(向后查询时)或者之前(向前查询时)。
  • RELATIVE 0,FORWARD 0,BACKWARD 0都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚抓取过的行。除非游标定位在第一行之前或者最后一行之后,否则这个动作都应该成功。而当游标定位在第一行之前或者最后一行之后,不返回任何行。
  • 当FETCH的游标上涉及非系统表时,不支持BACKWARD、PRIOR、FIRST等涉及反向获取操作。

语法格式

FETCH [ direction { FROM | IN } ] cursor_name;

其中direction子句为可选参数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
NEXT
   | PRIOR
   | FIRST
   | LAST
   | ABSOLUTE count
   | RELATIVE count
   | count
   | ALL
   | FORWARD
   | FORWARD count
   | FORWARD ALL
   | BACKWARD
   | BACKWARD count
   | BACKWARD ALL

参数说明

  • direction

    定义抓取数据的方向。

    取值范围:

    • NEXT(缺省值)

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

    • PRIOR

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

    • FIRST

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

    • LAST

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

    • ABSOLUTE count

      抓取查询中第count行。

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

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

      • count为正数,就从查询结果的第一行开始,抓取第count行。当count小于当前游标位置时,涉及到rewind操作,暂不支持。
      • count为负数或0,涉及到反向扫描操作,暂不支持。
    • RELATIVE count

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

      取值范围:有符号的整数

      • count为正数就抓取当前关联位置之后的第count行。
      • count为负数或0,涉及到反向扫描操作,暂不支持。
      • 如果当前行没有数据的话,RELATIVE 0返回空。
    • count

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

    • ALL

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

    • FORWARD

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

    • FORWARD count

      与RELATIVE count的效果相同,从当前关联位置开始,抓取随后或前面的第count行。

    • FORWARD ALL

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

    • BACKWARD

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

    • BACKWARD count

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

      取值范围:有符号的整数

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

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

  • { FROM | IN } cursor_name

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

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

示例

 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
--创建一个schema。
gaussdb=# CREATE SCHEMA tpcds;
 
--创建表tpcds.customer_address。
gaussdb=# CREATE TABLE tpcds.customer_address
(
ca_address_sk         INTEGER           NOT NULL,
ca_address_id         CHARACTER(16)     NOT NULL,
ca_street_number      INTEGER                    ,
ca_street_name        CHARACTER (20)
);
 
--向表中插入多条记录。
gaussdb=# INSERT INTO tpcds.customer_address VALUES (1, 'AAAAAAAABAAAAAAA', '18', 'Jackson'),(2, 'AAAAAAAACAAAAAAA', '362', 'Washington 6th'),(3, 'AAAAAAAADAAAAAAA', '585', 'Dogwood Washington');

--SELECT语句,用一个游标读取一个表。开始一个事务。
gaussdb=# START TRANSACTION;

--建立一个名为cursor1的游标。
gaussdb=# CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1;

--抓取头3行到游标cursor1里。
gaussdb=# FETCH FORWARD 3 FROM cursor1;
 ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name      
---------------+------------------+------------------+--------------------
             1 | AAAAAAAABAAAAAAA | 18               | Jackson                           
             2 | AAAAAAAACAAAAAAA | 362              | Washington 6th                    
             3 | AAAAAAAADAAAAAAA | 585              | Dogwood Washington        
(3 rows)

--关闭游标并提交事务。
gaussdb=# CLOSE cursor1;

--结束一个事务。
gaussdb=# END;

--VALUES子句,用一个游标读取VALUES子句中的内容。开始一个事务。
gaussdb=# START TRANSACTION;

--建立一个名为cursor2的游标。
gaussdb=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1;

--抓取头2行到游标cursor2里。
gaussdb=# FETCH FORWARD 2 FROM cursor2;
column1 | column2
---------+---------
0 |       3
1 |       2
(2 rows)

--关闭游标并提交事务。
gaussdb=# CLOSE cursor2;

--结束一个事务。
gaussdb=# END;

--WITH HOLD游标的使用,开启事务。
gaussdb=# START TRANSACTION;

--创建一个with hold游标。
gaussdb=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM tpcds.customer_address ORDER BY 1;

--抓取头2行到游标cursor1里。
gaussdb=# FETCH FORWARD 2 FROM cursor1;
 ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name      
---------------+------------------+------------------+--------------------
             1 | AAAAAAAABAAAAAAA | 18               | Jackson                           
             2 | AAAAAAAACAAAAAAA | 362              | Washington 6th                    
(2 rows)

--结束事务。
gaussdb=# END;

--抓取下一行到游标cursor1里。
gaussdb=# FETCH FORWARD 1 FROM cursor1;
 ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name      
---------------+------------------+------------------+--------------------
             3 | AAAAAAAADAAAAAAA | 585              | Dogwood Washington        
(1 row)

--关闭游标。
gaussdb=# CLOSE cursor1;

--删除表tpcds.customer_address。
gaussdb=# DROP TABLE tpcds.customer_address;

--删除SCHEMA。
gaussdb=# DROP SCHEMA tpcds CASCADE;

相关链接

CLOSEMOVE

相关文档