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

posted @ 2018-11-21 12:21  大数据技术与数仓  阅读(386)  评论(0编辑  收藏  举报