2014-03-06 47 views
0

在下面的函数中我传递我的表名作为文本'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'; 
+0

@Houari不能使用该方法时许版本的Postgres 8.2。我收到错误“准备好的声明”格式“不存在” – user2569524

回答

0

一种未结合的光标必须用于动态查询。
它在文档描述了用于8.2版本:
http://www.postgresql.org/docs/8.2/interactive/plpgsql-cursors.html

37.8.2.2。 OPEC FOR EXECUTE

OPEN unbound_cursor FOR EXECUTE query_string;

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

一个例子:

OPEN FOR光标1 EXECUTE 'SELECT * 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' 
/