更新时间:2024-03-06 GMT+08:00

CURSOR

功能描述

CURSOR命令定义一个游标,用于在一个大的查询里面检索少数几行数据。

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

注意事项

  • 游标命令只能在事务块里使用。
  • 通常游标和SELECT一样返回文本格式。因为数据在系统内部是用二进制格式存储的,系统必须对数据做一定转换以生成文本格式。一旦数据是以文本形式返回,客户端应用需要把它们转换成二进制进行操作。使用FETCH语句,游标可以返回文本或二进制格式。
  • 应该小心使用二进制游标。文本格式一般都比对应的二进制格式占用的存储空间大。二进制游标返回内部二进制形态的数据,可能更易于操作。如果想以文本方式显示数据,则以文本方式检索会为用户节约很多客户端的工作。比如,如果查询从某个整数列返回1,在缺省的游标里将获得一个字符串1,但在二进制游标里将得到一个4字节的包含该数值内部形式的数值(大端顺序)。

语法格式

1
2
3
CURSOR cursor_name
    [ BINARY ]  [ NO SCROLL ]  [ { WITH | WITHOUT } HOLD ]
    FOR query;

参数说明

  • cursor_name

    将要创建的游标名。

    取值范围:遵循数据库对象命名规范。

  • BINARY

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

  • NO SCROLL

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

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

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

    • WITH HOLD:声明该游标在创建它的事务结束后仍可继续使用。
    • WITHOUT HOLD:声明该游标在创建它的事务之外不能再继续使用,此游标将在事务结束时被自动关闭。
    • 如果不指定WITH HOLD或WITHOUT HOLD,默认行为是WITHOUT HOLD。
  • query

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

    取值范围:SELECT或VALUES子句。

示例

建立一个名为cursor1的游标:

1
CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1;

建立一个名为cursor2的游标:

1
CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1;

WITH HOLD游标的使用示例。

开启事务:

1
START TRANSACTION;

创建一个with hold游标:

1
DECLARE cursor3 CURSOR WITH HOLD FOR SELECT * FROM tpcds.customer_address ORDER BY 1;

抓取头2行到游标cursor3里:

1
2
3
4
5
6
FETCH FORWARD 2 FROM cursor3;
 ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name   | ca_street_type  | ca_suite_number |     ca_city     |    ca_county    | ca_state |   ca_zip   |  ca_country   | ca_gmt_offset |   ca_location_type   
---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+----------------------
             1 | AAAAAAAABAAAAAAA | 18               | Jackson            | Parkway         | Suite 280       | Fairfield       | Maricopa County | AZ       | 86192      | United States |         -7.00 | condo               
             2 | AAAAAAAACAAAAAAA | 362              | Washington 6th     | RD              | Suite 80        | Fairview        | Taos County     | NM       | 85709      | United States |         -7.00 | condo               
(2 rows)

结束事务:

1
END;

抓取下一行到游标cursor3里:

1
2
3
4
5
FETCH FORWARD 1 FROM cursor3;
 ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name   | ca_street_type  | ca_suite_number |     ca_city     |    ca_county    | ca_state |   ca_zip   |  ca_country   | ca_gmt_offset |   ca_location_type   
---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+----------------------
             3 | AAAAAAAADAAAAAAA | 585              | Dogwood Washington | Circle          | Suite Q         | Pleasant Valley | York County     | PA       | 12477      | United States |         -5.00 | single family       
(1 row)

关闭游标:

1
CLOSE cursor3;

相关链接

FETCH