我需要在对表进行SELECT之前调用postgreSQL中的FUNCTION。我的第一个想法是使用TRIGGER,但看起来你无法触发选择。
因此,为了解决这个问题,我创建了一个VIEW,它可以同时运行表上的select和函数。即:
CREATE VIEW people_view AS
SELECT get_department(), name, title, department
FROM people_table
因此,简而言之...... get_department()函数将从外部数据更新部门列(这全部使用外部数据表和包装器)。
问题是,在选择名称,标题,部门之后执行该功能,而不是之前执行。所以如果我运行它一旦它不起作用。如果我运行它两次(因为它在第一次运行后更新)。
很抱歉,如果这没有多大意义。我通常不做数据库工作。我想做的是得到" get_department()"在SELECT中首先执行。我试图将函数调用放在子查询中,但它仍然没有先执行。我离开的唯一想法可能是强制订单的明确联合?我不知道: - (。
基本上,我只是想在运行查询的人之前透明地执行一个SELECT函数......我想你不能用触发器来做。如果有更好的解决方法,我会非常乐意为它做好准备。
谢谢, Isekal
答案 0 :(得分:3)
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
功能。
答案 1 :(得分:1)
可能是您构造了一个返回表格的函数,并在选择数据之前包含对函数的调用。
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.
希望它有所帮助。