Postgres pg库 隐式游标的使用
语法:
有这么一个FOR语法的变形,它允许通过游标返回的行进行迭代。如下:
[ <<label>> ]
FOR recordvar IN bound_cursorvar [ ( [ argument_name := ] argument_value [, ...] ) ] LOOP
statements
END LOOP [ label ];
在声明游标变量时,它必须已经绑定到一些查询语句上,并且不能是打开状态。 FOR语法会自动打开游标,并且当退出循环时自动关闭游标。只有当游标被声明要使用参数时, 必须有一列实际参数值表达式。这些值会被替换到查询中,采用如同OPEN的方式 (参阅第 40.7.2.3 节)。
recordvar变量会自动定义为record类型, 并且只存在于循环中(循环中任何的定义变量名的动作都会被忽略)。 每一个由游标返回的行都会陆续的被分配到记录变量中,然后执行循环体。
区别说明:
1)cursor和refcursor的区别:
静态游标,不能修改里面的语句
动态游标,可以多次open和close,指定不同的SQL
隐式游标,DML和for操作,都在内部转换为了一个隐式游标在执行
2)fetch的区别:
使用fetch cur 和 fetch next from cur 一样,因为NEXT 是 FETCH 的默认选项.
具体例子:
--隐式游标,实际上
select
*
from
test是存在一个内部的游标中的:
raise notice
'隐式游标:'
;
FOR one_row IN (SELECT * FROM test) loop
raise notice
'row info, id is: %, info is: %, crt_time is: %'
, one_row.id, one_row.info, one_row.crt_time;
END loop;
传送门:https://www.cnblogs.com/kuang17/p/13639457.html
http://postgres.cn/docs/9.3/plpgsql-cursors.html
复制区
CREATE OR REPLACE FUNCTION "public"."fun_repairdata"()
RETURNS "pg_catalog"."varchar" AS $BODY$
DECLARE
rowdata record;
BEGIN
raise notice '隐式游标:begin';
FOR rowdata IN ( SELECT vipcode
FROM repair_data_ali a left join xf_vip b on(b.xf_vipcode=a.vipcode) )
loop
raise notice 'row info, id is: %', rowdata.vipcode;
END loop;
raise notice '隐式游标:end';
RETURN('true');
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;