4

下面是将记录存储在每次迭代的记录变量中的函数。在这里,表名是针对游标绑定变量进行硬编码的。有什么方法可以通过这个函数将表名作为参数传递?

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

1 回答 1

4

不,不适用于绑定光标。

但是你可以很容易地传递一个名称来打开一个未绑定的游标。手册中有一个示例正是这样做的

您的函数可能如下所示:

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循环只能与绑定游标一起使用。我提供了一个替代方案。
在这个密切相关的答案中有更多解释:
Update record of a cursor where the table name is a parameter

我使用对象标识符类型regclass来传递表名以避免 SQL 注入。有关 dba.SE 的相关答案的
更多信息:

于 2013-09-20T16:04:45.240 回答