Greenplum中游标的使用
CLOSE
描述:关闭一个游标
语法:
CLOSE cursor_name
注意:Greenplum数据库不支持显示地打开(open)游标,当一个游标被声明的时候就会被打开,使用declare语句声明并且打开一个游标
DECLARE
描述:定义一个游标
语法:
DECLARE name [BINARY] [INSENSITIVE] [NO SCROLL] CURSOR
[{WITH | WITHOUT} HOLD]
FOR query [FOR READ ONLY]
参数:
name
被创建的游标的名字
BINARY
游标以binary的数据返回,而不是以text形式返回
INSENSITIVE
在greenplum数据库中所有的游标都是insensitive,这个参数目前没有影响,并且与标准的SQL兼容
NO SCROLL
游标不能以非顺序的方式提取数据,该参数为默认值,目前不支持scrollable cursors (SCROLL)
WITH HOLD 与WITHOUT HOLD
WITH HOLD 指的事务被成功提交之后还可以继续被使用。
WITHOUT HOLD 指的游标不可以在创建它的事务之外使用,WITHOUT HOLD 是默认值.
当查询中包括FOR UPDATE or FOR SHARE语句时,WITH HOLD 不能使用.
query
能够让游标返回row的命令
FOR READ ONLY
游标以只读的方式使用
Examples
Declare a cursor:
DECLARE mycursor CURSOR FOR SELECT * FROM mytable;
兼容性:
1.标准的SQL允许游标嵌入SQL和模块之中,greenplum数据库允许以交互式的形式使用你游标
2.greenplum没有为游标实现open的语句,当一个游标被声明的时候,会被打开
3.标准的SQL允许向前和向后移动游标,greenplum数据库只允许向前移动游标
4.Binary cursors是 Greenplum 数据库的扩展.
FETCH
描述:从一个使用游标的查询中提取数据row
语法
FETCH [ forward_direction { FROM | IN } ] cursorname
forward_direction 可以为空也可以是下面的其中一个:
NEXT
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
参数:
forward_direction
定义提取数据的方向和提取的行数,greenplum仅仅支持向前提取数据,可以使用一下参数:
NEXT
提取下一行,如果forward_direction省略,则为默认值。
FIRST
提取查询结果的第一行(和ABSOLUTE 1 一样),只有第一次使用游标提取数据的时候,才可以被使用
LAST
提取查询结果的最后一行(和 ABSOLUTE -1一样)
ABSOLUTE count
提取查询结果的具体行数的数据,如果超过了行的范围,则返回最后一行。
RELATIVE count
提取在当前游标位置之前的查询结果的具体行数的数据,RELATIVE 0代表重新提取当前行
count
提取count数量的行(和FORWARD count一样)
ALL
提取所有的剩余行(和FORWARD ALL一样)
FORWARD
提取下一行(和NEXT一样)
Fetch the next row (same as NEXT).
FORWARD count
提取下面count数量的行,FORWARD 0 代表重新提取当前行.
FORWARD ALL
提取所有的剩余行
cursorname
游标的名字
Examples
-- 开启一个事务:
BEGIN;
-- 设置游标:
DECLARE mycursor CURSOR FOR SELECT * FROM films;
-- 提取游标中的前5行数据:
FETCH FORWARD 5 FROM mycursor;
code | title | did | date_prod | kind | len
-------+-------------------------+-----+------------+----------+-------
BL101 | The Third Man | 101 | 1949-12-23 | Drama | 01:44
BL102 | The African Queen | 101 | 1951-08-11 | Romantic | 01:43
JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08
P_302 | Becket | 103 | 1964-02-03 | Drama | 02:28
-- 关闭游标结束事务:
CLOSE mycursor;
COMMIT;
MOVE
描述:定位一个游标
语法
MOVE [ forward_direction {FROM | IN} ] cursorname
下面的forward_direction参数具体参考FETCH的参数
NEXT
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
Outputs
输出的结果值
MOVE count
Examples
-- 开启一个事务:
BEGIN;
-- 设置游标:
DECLARE mycursor CURSOR FOR SELECT * FROM films;
-- 将游标位置向前移动5行:
MOVE FORWARD 5 IN mycursor;
MOVE 5
--提取下一行数据 (从第6行开始):
FETCH 1 FROM mycursor;
code | title | did | date_prod | kind | len
-------+--------+-----+------------+--------+-------
P_303 | 48 Hrs | 103 | 1982-10-22 | Action | 01:37
(1 row)
--关闭游标结束事务:
CLOSE mycursor;
COMMIT;
END
描述:提交当前事务.
语法
END [WORK | TRANSACTION]
参数
WORK
TRANSACTION
选择性的参数,不起作用.
Examples
提交当前事务:
END;
兼容性
END 是greenplum数据库提供的功能性扩展,等同于COMMIT ,而COMMIT 是标准的SQL语句。
COMMIT
描述:提交当前事务
语法
COMMIT [WORK | TRANSACTION]
参数
WORK
TRANSACTION
选择性的参数,不起作用.
Examples
提交当前事务:
COMMIT;
BEGIN
描述:启动一个事务块.
语法
BEGIN [WORK | TRANSACTION] [transaction_mode]
[READ ONLY | READ WRITE]
transaction_mode参数如下:
ISOLATION LEVEL | {SERIALIZABLE | READ COMMITTED | READ UNCOMMITTED}
参数
WORK
TRANSACTION
可选择的关键字,不起作用
SERIALIZABLE
READ COMMITTED
READ UNCOMMITTED
标准SQL定义了四种事务隔离级别: READ COMMITTED, READ
UNCOMMITTED, SERIALIZABLE, and REPEATABLE READ。默认值为 READ COMMITTED.
在Greenplum中READ COMMITTED与READ UNCOMMITTED是一样的。Greenplum不支持REPEATABLE READ ,如果需要使用此隔离级别,则使用 SERIALIZABLE 来代替。
SERIALIZABLE最严格的事务隔离。
READ WRITE
READ ONLY
决定事务是读/写还是只读. Read/write 是默认的.
当transaction 是 read-only时, 一些SQL语句会被不允许使用,比如:INSERT,
UPDATE, DELETE等。
Examples
开启一个事务块:
BEGIN;
以 serializable 隔离级别开启一个事务块:
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;