六、游标:
\1. 声明游标变量:
在PL/pgSQL中对游标的访问都是通过游标变量实现的,其数据类型为refcursor。 创建游标变量的方法 有以下两种:
1). 和声明其他类型的变量一样,直接声明一个游标类型的变量即可。 2). 使用游标专有的声明语法,如:
其中arguments为一组逗号分隔的name datatype列表,见如下示例:
|
name CURSOR [ ( arguments ) ] FOR query; |
WHEN condition [ OR condition ... ] THEN
handler_statements
END;
在上面三个例子中,只有第一个是未绑定游标,剩下两个游标均已被绑定。
\2. 打开游标: 游标在使用之前必须先被打开,在PL/pgSQL中有三种形式的OPEN语句,其中两种用于未绑定的游标变
量,另外一种用于绑定的游标变量。
1). OPEN FOR:
其声明形式为:
该形式只能用于未绑定的游标变量,其查询语句必须是SELECT,或其他返回记录行的语句,如 EXPLAIN。在PostgreSQL中,该查询和普通的SQL命令平等对待,即先替换变量名,同时也将该查询的 执行计划缓存起来,以供后用。见如下示例:
2). OPEN FOR EXECUTE
其声明形式为:
和上面的形式一样,该形式也仅适用于未绑定的游标变量。EXECUTE将动态执行其后以文本形式表示的 查询字符串。
3). 打开一个绑定的游标 其声明形式为:
该形式仅适用于绑定的游标变量,只有当该变量在声明时包含接收参数,才能以传递参数的形式打开该 游标,这些参数将被实际代入到游标声明的查询语句中,见如下示例:
|
OPEN unbound_cursor FOR query; |
|
OPEN curs1 FOR SELECT * FROM foo WHERE key = mykey; |
|
OPEN unbound_cursor FOR EXECUTE query-string; |
|
OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1); |
|
OPEN bound_cursor [ ( argument_values ) ]; |
|
OPEN curs2;
OPEN curs3(42);
|
curs1 refcursor;
curs2 CURSOR FOR SELECT * FROM tenk1;
curs3 CURSOR (key integer) IS SELECT * FROM tenk1 WHERE unique1 = key;
\3. 使用游标: 游标一旦打开,就可以按照以下方式进行读取。然而需要说明的是,游标的打开和读取必须在同一个事
物内,因为在PostgreSQL中,如果事物结束,事物内打开的游标将会被隐含的关闭。 1). FETCH
其声明形式为:
FETCH命令从游标中读取下一行记录的数据到目标中,其中目标可以是行变量、记录变量,或者是一组 逗号分隔的普通变量的列表,读取成功与否,可通过PL/pgSQL内置变量FOUND来判断,其规则等同于 SELECT INTO。见如下示例:
2). CLOSE
其声明形式为:
关闭当前已经打开的游标,以释放其占有的系统资源,见如下示例:
CLOSE curs1;




