下面是将记录存储在每次迭代的记录变量中的函数。此处的表名是针对游标绑定变量硬编码的。有什么方法可以通过此函数将表名作为参数传递吗?
CREATE OR REPLACE FUNCTION test1()
RETURNS SETOF refcursor AS
$BODY$
DECLARE
curs2 CURSOR FOR SELECT * FROM datas.test1000;
begin
FOR recordvar IN curs2 LOOP
RAISE NOTICE 'recordvar: %',recordvar;
END LOOP ;
end;
$BODY$
language plpgsql;
否,不适用于绑定游标。
但是,您可以轻松地传递用于打开未绑定游标的名称。手册中有一个例子正是这样做的。
您的函数可能如下所示:
CREATE OR REPLACE FUNCTION test2(_tbl regclass)
RETURNS void AS
$func$
DECLARE
_curs refcursor;
rec record;
BEGIN
OPEN _curs FOR EXECUTE
'SELECT * FROM ' || _tbl;
LOOP
FETCH NEXT FROM _curs INTO rec;
EXIT WHEN rec IS NULL;
RAISE NOTICE 'rec: %', rec;
END LOOP;
END
$func$ language plpgsql;
特殊FOR
循环只能与绑定游标一起使用。我提供了一个替代方案。
在这个密切相关的答案中有更多解释:
更新表名为参数的游标的记录
我使用对象标识符类型regclass
来传递表名以避免SQL注入。
更多关于这一点的信息,请参阅 dba.SE 的相关答案: