PSQL:沉默函数调用的输出,或者在没有SELECT的情况下调用它

时间:2011-08-23 18:56:10

标签: postgresql

在Postgresql中,我在一个表上有一个UPDATE规则,只需要调用dctUpdate函数而不执行整个SQL语句,因为SQL语句实际上是在函数中完成的。我知道调用该函数的唯一方法是通过SELECT dctUpdate(windowId)

create or replace function infoUpdate(windowId in numeric) returns void as $$
begin
    if windowId is null then
        update info_timestamp set timestamp = now();
    else
        update info_timestamp set timestamp = now() where window_id = windowId;
    end if;
end;
$$ LANGUAGE plpgsql;


create or replace rule info_update_rule as on update to some_table do also select infoUpdate(NEW.window_id);

但是,在命令行中,当因为我在some_table中更新了一行而触发了该规则时,我从调用该函数的SELECT子句中得到无用的输出:

db=# update some_table set name = 'foobar' where window_id = 1;
 infoupdate 
-----------

(1 row)

UPDATE 1

有没有办法让info_update_rule调用infoUpdate函数而不显示虚拟输出?

2 个答案:

答案 0 :(得分:1)

我发现没有选项可以使用规则来实现它,但是有另一种方法来实现这个usign触发器。

因此,您将触发器功能定义如下:

CREATE OR REPLACE FUNCTION ur_wrapper_trg()
  RETURNS trigger AS
$BODY$
begin
    perform infoUpdate(NEW.window_id);
    RETURN NEW;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION ur_wrapper_trg() OWNER TO postgres;

使用注意PERFORM语法。此语法与SELECT语法相同,只是它会压缩所有输出。

比定义触发器

CREATE TRIGGER some_table_utrg
  BEFORE UPDATE
  ON some_table
  FOR EACH ROW
  EXECUTE PROCEDURE ur_wrapper_trg();

最后,你重新掌握了你的规则。

未使用null进行测试,但实际windos_id按预期工作,没有任何不需要的输出。

有关详细说明,请咨询TriggersRules vs triggers

答案 1 :(得分:0)

我所关注的解决方案是在\t \a之前和之后调用select function()。唯一剩下的就是为每次通话换一个新线。