2017-11-06 2 views
0

그 함수의 매개 변수를 사용하여 저장 기능에서보기 만들기 :나는이 같은 뷰 만들기 위해 노력하고

CREATE OR REPLACE FUNCTION calculate(datemin DATE,datemax DATE) RETURNS VOID AS 
$BODY$ 
BEGIN 
    DROP VIEW IF EXISTS zdroits CASCADE; 
    CREATE VIEW zdroits AS 
    SELECT r.* 
    FROM rights r 
    WHERE r.date_paid BETWEEN datemin AND datemax; 
    -- the rest of the function will use the view 
END; 
$BODY$ LANGUAGE plpgsql; 

을하지만 PostgreSQL의 날 column datemin does not exist 말 뷰를 만들 수 없습니다.

대신, 나는이 함께 WHERE 라인을 교체, 그것은 괜찮 : 나는 매개 변수화 된 뷰를 만들려고하고 있지 않다

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

'select * from view'와 SQL 함수 내의 동등한 구문 사이에 필요한 메모리에는 차이가 없습니다 (PL/pgSQL은 필요 없습니다) –

답변

2

나는 왜 그걸 원하겠습니까? a_horse_with_no_name 말했듯이 - 당신은 매개 변수로 함수 자체를 사용할 수 있지만 순전히 학문적, 당신은 nelow 같은 FN()을 만들 수 있습니다

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) 
관련 문제