问题描述
我在Postgres 10.6中使用plpgsql。我有一个声明并为变量赋值的函数。该函数还定义了一个视图,我想在定义中使用该变量。
create view myview as
select
some_columns
from
mytable
where
id = _id /*_id is declared earlier in function */
;
在这种情况下,可以定义函数,但是在运行该函数时会出现错误:UndefinedColumn: column "_id" does not exist
在Postgres中有这种可能吗?视图是否可以将变量作为其定义的一部分?
我确实看到here,在BigQuery(我从未使用过)中,我所问的是不可能的,这使我认为在plpgsql中也不可能。
这没什么大不了,但我很好奇。一种解决方法-可能是推荐的解决方案-是在我从视图中选择时传递_id(例如select * from myview where id = 3
)。或者,如果我真的想保持select调用简单(之所以这样做,是因为我的实际实现更加复杂并且具有多个变量),则可以将视图定义为字符串,并在函数内使用execute
(是在构建和创建数据库时使用的所有内部工具,而不是担心动态sql固有的各种风险的情况。
解决方法
否,您不能将变量传递给视图。但是您可以使用以下功能来实现此目的:
create function my_view_function(p_id integer)
returns table (id int,column_1 int,column2 text)
as
$$
select id,column_1,column_2
from my_table
where id = p_id;
$$
language sql
stable;
然后像这样使用它
select *
from my_view_function(42);