2015-06-29 62 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; 
相關問題