使用该函数的参数从存储函数创建视图
Creating a view from a stored function using that function's parameters
我正在尝试创建这样的视图:
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'
我不是要创建参数化视图。我想将传递给函数的参数用作 "literals".
为了了解 如何帮助我,我尝试了这样的事情:
EXECUTE '
CREATE VIEW zdroits AS
SELECT r.*
FROM rights r
WHERE r.date_paid BETWEEN AND ;
' USING (datemin,datemax);
但编译器说 "there is no parameter "。
有办法吗?
我不是在问你为什么要那个。正如 a_horse_with_no_name 所说 - 您可以使用带有参数的函数本身,但纯粹在学术上,您可以像下面这样创建 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)',,) 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)
我正在尝试创建这样的视图:
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'
我不是要创建参数化视图。我想将传递给函数的参数用作 "literals".
为了了解
EXECUTE '
CREATE VIEW zdroits AS
SELECT r.*
FROM rights r
WHERE r.date_paid BETWEEN AND ;
' USING (datemin,datemax);
但编译器说 "there is no parameter "。
有办法吗?
我不是在问你为什么要那个。正如 a_horse_with_no_name 所说 - 您可以使用带有参数的函数本身,但纯粹在学术上,您可以像下面这样创建 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)',,) 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)