sus*_*ins 1 sql postgresql view plpgsql
我将 plpgsql 与 Postgres 10.6 一起使用。我有一个函数声明变量并为其赋值。该函数还定义了一个视图,我想在定义中使用该变量。
create view myview as
select
some_columns
from
mytable
where
id = _id /*_id is declared earlier in function */
;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,可以定义该函数,但运行时会出现错误:UndefinedColumn: column "_id" does not exist
在 Postgres 中这样的事情可能吗?视图可以包含变量作为其定义的一部分吗?
我确实在这里看到,在 BigQuery (我从未使用过)中,我所要求的是不可能的,这让我认为这在 plpgsql 中也可能是不可能的。
这没什么大不了的,但我很好奇。一种解决方法 - 可能也是推荐的解决方案 - 是当我从视图中选择时传递 _id (例如select * from myview where id = 3)。或者,如果我真的想让 select 调用保持简单(我这样做,因为我的实际实现更复杂并且有多个变量),我可以将视图定义为字符串并execute在函数中使用(这是所有使用的内部内容)在构建和创建数据库时,而不是在担心动态 sql 固有的各种风险的情况下)。
小智 7
不,您不能将变量传递给视图。但你可以用一个函数来做到这一点:
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;
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
select *
from my_view_function(42);
Run Code Online (Sandbox Code Playgroud)