2017-11-06 19 views
0

を使用してストアド・ファンクションからのビューを作成します。は、私は、このようなビューを作成しようとしています、その関数のパラメータ

代わりにあれば、私はこれでWHERE行を置き換え、それはokです:

WHERE r.date_paid BETWEEN '2011-01-01' AND '2016-12-31' 

私はパラメータ化ビューを作成しようとしていないのです。関数に渡されたパラメータを "リテラル"として使用したいと思います。 this answerが私を助けることができる方法を理解しようとすると

は、私はこのようなものを試し:

EXECUTE ' 
    CREATE VIEW zdroits AS 
    SELECT r.* 
    FROM rights r 
    WHERE r.date_paid BETWEEN $1 AND $2; 
' USING (datemin,datemax); 

コンパイラは、「何のパラメータ$ 1は存在しない」と言います。

これを行う方法はありますか?

+1

なぜあなたは、単一のクエリに使用できるビューをしたいですか?なぜ、日付範囲を渡して結果を返すSQL関数を作成しないのですか? –

+0

私は700000行を返す関数は効率的ではないと思ったので、今私はそれを考えるようになりました、それはビューとは違うかもしれません。アイデアをありがとう、私はこれをテストします。 –

+1

SQL関数内の 'select * from view'と同等のステートメントの間に必要なメモリに違いはありません(PL/pgSQLは必要ありません) –

答えて

2

私はあなたがなぜそれを望むのか尋ねていません。 a_horse_with_no_nameと言った - あなたはパラメータで関数自体を使用することができますが、純粋に学問的には、(FNを作成することができます)nelowのように:

t=# create or replace function mv(a int,b int) returns void as $$ 
begin 
drop view if exists va; 
execute format('create view va as select least(%s,%s)',$1,$2) using(a,b); 
end; 
$$ language plpgsql 
; 
CREATE FUNCTION 
t=# select mv(2,4); 
NOTICE: view "va" does not exist, skipping 
CONTEXT: SQL statement "drop view if exists va" 
PL/pgSQL function mv(integer,integer) line 3 at SQL statement 
mv 
---- 

(1 row) 

t=# select * from va; 
least 
------- 
    2 
(1 row) 

t=# select mv(7,4); 
mv 
---- 

(1 row) 

t=# select * from va; 
least 
------- 
    4 
(1 row) 
関連する問題