2015-06-29 25 views
4

我在PostgreSQL的这个功能:如何使用参数创建函数的VIEW?

CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[]) 
    RETURNS SETOF typ_new AS 
$BODY$ 
declare 
begin 
    CREATE OR REPLACE VIEW newView as (select * from func2($1,$2,$3)); 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

func2也返回SETOF typ_new,使他们相互兼容。

当运行它,我得到一个错误:ERROR: there is no parameter $1 如果我改变$1参数名a那么错误更改 ERROR: column "a" does not exist

我也试过动态SQL:

sqlstr ='CREATE OR REPLACE VIEW newView (columns...) as 
       (select * from func2('||$1||','||$2||','||$3||'))'; 
    execute sqlstr; 

但不起作用,因为$3integer[]||不能使用数组。

我该如何解决这个问题?

+0

您似乎在尝试执行动态SQL;看看PL/PgSQL的'EXECUTE'和'format'参数。详情请参阅许多相关答案。 –

+0

@Craig,查看文章编辑 – John

+0

也许最好是创建'VIEW as $ BODY $'并从该视图中选择函数? – Smileek

回答

4
CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[]) RETURNS void AS 
$BODY$ 
BEGIN 
    EXECUTE 'CREATE OR REPLACE VIEW newView AS ' || 
      'SELECT * FROM func2(' || $1 || ', ' || $2 || ', ' || array_to_string($3, ',') || ')'; 
    RETURN; 
END; 
$BODY$ LANGUAGE plpgsql STRICT; 

请注意,该函数返回void,而不是SETOF typ_new,因为您正在创建一个视图,而不是从视图返回数据。在typ_new类型的元素:

由于func2()回报typ_new你没有显式声明该视图的列,它们将从SELECT声明作出。

+0

使用'format'与'%L'格式说明符,而不是串联和'array_to_string'调用。清洁器。 –

0

我不确定。但如果你只是想通过数组动态SQL字符串,你可以嘲笑它..

do 
$$ 
declare 
    a integer[]; 
begin 
    a := array[11,22,33,22,11]; 
    raise info '%','you can mock up array in like this: array['||array_to_string(a,',')||']'; 

end; 

$$ 
; 

我你的情况是这样的:?

sqlstr ='CREATE OR REPLACE VIEW newView (columns...) as 
       (select * from func2('||$1||','||$2||',array['||array_to_string($3,',')||']))'; 
    execute sqlstr; 
相关问题