为游标绑定变量参数化表名

Posted

技术标签:

【中文标题】为游标绑定变量参数化表名【英文标题】:Parameterize table name for cursor bound variable 【发布时间】:2013-09-20 10:58:15 【问题描述】:

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

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;

【问题讨论】:

【参考方案1】:

不,不适用于绑定光标。

但您可以轻松传递名称以打开unbound cursor。有一个example in the manual doing precisely that。

您的函数可能如下所示:

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;

special FOR loop 只能与 bound 游标一起使用。我提供了一个替代方案。 在这个密切相关的答案中有更多解释:Update record of a cursor where the table name is a parameter

我使用object identifier type regclass 来传递表名以避免SQL 注入。 在this related answer on dba.SE 中了解更多信息:

【讨论】:

以上是关于为游标绑定变量参数化表名的主要内容,如果未能解决你的问题,请参考以下文章

我可以在准备好的语句中参数化表名吗?

11g新特性之自适应游标共享(Adaptive Cursor Sharing)

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名

在 Alter table 脚本中使用绑定变量作为表名

在PL/SQL中使用游标动态sql和绑定变量的小例子

Oracle函数:如何将表名作为参数传递,并使用游标结果作为表名?