2016-02-27 143 views
1

我需要在对表进行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

回答

2
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功能。

+0

这工作完美!我从来不知道是否存在(现在我没有做很多数据库工作)。不幸的是,我在9.2上,所以LATERAL不是一种选择(尽管我可能会升级)。 – isekal

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. 

希望它他LPS。

相关问题