将表名作为输入参数动态传递并使用它[重复]

Posted

技术标签:

【中文标题】将表名作为输入参数动态传递并使用它[重复]【英文标题】:Passing table name to function Dynamically as Input parameter and using it [duplicate] 【发布时间】:2014-03-06 21:45:16 【问题描述】:

在下面的函数中,我将表名作为文本“K”传递,并希望将其用于函数内的光标声明。我使用的是 postgres 8.2 (greenplum)

我用过quote_ident(k),也可以。有人能帮帮我吗。谢谢!

CREATE OR REPLACE FUNCTION vin_temp(K text) RETURNS text AS
    $BODY$
    DECLARE
        r vin_res%rowtype;
        r1 numeric default 0;

        rfr numeric default 0;
        rdu numeric default 0;
        rav numeric default 0;

        rfr1 numeric default 0;
        rdu1 numeric default 0;
        rav1 numeric default 0;


        r2 numeric default 0;
        i integer default 0;
        x  text default '';
        curs2 CURSOR FOR SELECT * FROM k order by week_end asc;
    BEGIN

    open curs2;
      LOOP
      FETCH curs2 INTO r;
      exit when not found;

         if (i=1) then
          r1:=r.v1;
          rav:=r.v2;
          rfr:=r.v3;
          else 
          some logic here
          end if;

        END LOOP;
        RETURN 'yes';
    END
    $BODY$
    LANGUAGE 'plpgsql' ;

我也尝试了以下代码:

curs2 CURSOR FOR EXECUTE 'SELECT * from '||quote_ident(k)||' order by week_end asc';

【问题讨论】:

@Houari 不能像在 postgres 8.2 版本上那样使用该方法。我收到错误“准备好的语句”格式“不存在” 【参考方案1】:

未绑定游标必须用于动态查询。 它在 8.2 版的文档中有所描述:http://www.postgresql.org/docs/8.2/interactive/plpgsql-cursors.html

37.8.2.2。开放执行

OPEN unbound_cursor FOR EXECUTE query_string;

游标变量被打开并给出要执行的指定查询。游标不能已经打开,并且它必须被声明为一个未绑定的游标(即,作为一个简单的 refcursor 变量)。查询被指定为字符串表达式,与 EXECUTE 命令中的方式相同。像往常一样,这提供了灵活性,因此查询可以从一次运行到下一次运行。

一个例子:

打开 curs1 FOR EXECUTE 'SELECT * FROM ' ||报价标识($1);

(强调我的) 这是一个工作示例,请查看此链接:http://sqlfiddle.com/#!11/a0d8a/1

CREATE OR REPLACE FUNCTION vin_temp(K text) RETURNS int 
AS
$BODY$
DECLARE
  curs1 refcursor;
  x int;
begin
  OPEN curs1 FOR EXECUTE 'Select Sum( x ) From ' || $1;
  Fetch curs1 Into x;
  Close curs1;
  Return x;
End
$BODY$ LANGUAGE 'plpgsql' 
/

【讨论】:

以上是关于将表名作为输入参数动态传递并使用它[重复]的主要内容,如果未能解决你的问题,请参考以下文章

存储过程,将表名作为参数传递

pl/sql 过程不允许将表名/视图名作为参数传递

如何在存储过程中动态传递表名 - ORACLE [重复]

将表名传递给函数并返回表

sql中写function是不是可以将表名作为参数传入进行动态查询

如何将表名作为参数传递给存储过程?