传递表名称以动态方式作为输入参数并使用它

时间:2014-03-06 21:45:16

标签: sql function cursor greenplum

在下面的函数中,我将我的表名称作为文本'K'传递,并希望将其用于我的函数中的游标声明。我正在使用postgres 8.2(greenplum)

我使用quote_ident(k),dint也工作。有人可以帮助我吗?谢谢!

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

1 个答案:

答案 0 :(得分:0)

动态查询必须使用未绑定游标 版本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命令相同。像往常一样,这提供了灵活性,因此查询可以从一次运行到下一次运行。

     

一个例子:

     

OPEN curs1 FOR EXECUTE'CELECT * FROM'|| quote_ident($ 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' 
/