在Postgres中执行函数优先

时间:2016-02-27 16:39:22

标签: postgresql

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

2 个答案:

答案 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.

希望它有所帮助。