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;

 

posted @ 2022-03-24 15:08  越过那个限制  阅读(499)  评论(0编辑  收藏  举报