执行函数首先在Postgres中
问题描述:
我需要在对表进行SELECT操作之前调用postgreSQL中的FUNCTION。我的第一个想法是使用TRIGGER,但看起来你不能在选择时触发。执行函数首先在Postgres中
因此,要解决这个问题,我创建了一个VIEW,它可以同时在表和函数上运行select。即:
CREATE VIEW people_view AS
SELECT get_department(), name, title, department
FROM people_table
所以,简而言之...的get_department()函数将更新来自外部数据的部门列(这是所有采用国外的数据表和包装)。
问题是,该函数执行后名称,标题,部门被选中,而不是之前。所以如果我运行一次它不起作用。如果我运行它两次它(因为它在第一次运行后更新)。
对不起,如果这没有多大意义。我通常不做数据库工作。我想要做的是让“get_department()”在SELECT中首先执行。我试图把这个函数调用放在一个子查询中,但它仍然没有先执行。我留下的唯一想法可能是强制命令的明确联合?我不知道:-(。
基本上,我只是想在运行查询的人透明地SELECT之前执行一个函数...我想你不能用触发器做到这一点,如果有更好的解决方法,我会很乐意给它一展身手。
感谢, Isekal
答
with t(x) as (
select get_department()) -- Function executes here
select
t.x, ...
from
t, people_table -- You does not provide any relation between your function and table...
还检查LATERAL
功能。
答
可能是你构建返回你的表,包括选择数据之前调用你的函数的函数。
CREATE OR REPLACE FUNCTION people_table()
RETURNS TABLE(name character varying, title character varying, department character varying) AS
$BODY$
BEGIN
-- do function call
SELECT get_department();
RETURN QUERY
SELECT people_table.* FROM people_table;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
-- then, later in your code, use table selecting on the new function
SELECT * from people_table();
-- notice the use of parenthesis.
-- you may also
SELECT name FROM people_table() ORDER BY department DESC;
-- and use the function as if it were the table itself.
希望它他LPS。
这工作完美!我从来不知道是否存在(现在我没有做很多数据库工作)。不幸的是,我在9.2上,所以LATERAL不是一种选择(尽管我可能会升级)。 – isekal