Postgresql PSQL:使函数调用的输出静音,或在没有选择的情况下调用它
在Postgresql中,我对一个表有一个更新规则,它只需要调用一个dctUpdate函数,而不需要执行整个SQL语句,因为SQL语句实际上是在函数中完成的。我知道调用该函数的唯一方法是通过选择dctUpdatewindowId: 但是,在命令行上,当由于我更新了某个_表中的一行而触发该规则时,我会从调用函数的SELECT子句中获得无用的输出:Postgresql PSQL:使函数调用的输出静音,或在没有选择的情况下调用它,postgresql,Postgresql,在Postgresql中,我对一个表有一个更新规则,它只需要调用一个dctUpdate函数,而不需要执行整个SQL语句,因为SQL语句实际上是在函数中完成的。我知道调用该函数的唯一方法是通过选择dctUpdatewindowId: 但是,在命令行上,当由于我更新了某个_表中的一行而触发该规则时,我会从调用函数的SELECT子句中获得无用的输出: db=# update some_table set name = 'foobar' where window_id = 1; infoupdate
db=# update some_table set name = 'foobar' where window_id = 1;
infoupdate
-----------
(1 row)
UPDATE 1
有没有一种方法可以让info\u update\u rule在不显示虚拟输出的情况下调用infoUpdate函数?我没有找到使用规则实现此功能的选项,但有另一种方法可以实现此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;
注意:使用了语法。此语法与SELECT语法相同,只是它禁止所有输出
然后定义一个触发器
CREATE TRIGGER some_table_utrg
BEFORE UPDATE
ON some_table
FOR EACH ROW
EXECUTE PROCEDURE ur_wrapper_trg();
最后,你会记住你的规则
没有使用null进行测试,但是使用实际的windos_ID可以正常工作,没有任何不需要的输出
有关详细说明,请咨询和。我的解决方案是在select函数之前和之后调用\t\a。唯一剩下的是每次调用都有一个新行。如果新窗口id为空,您真的要将整个表中的所有时间戳都设置为现在吗?您需要支持哪些版本的PostgreSQL?@mu:是的,我的意思是将所有时间戳设置为NULL,并且我支持PostgreSQL 9.0,出于性能原因,upI不能使用触发器。此规则将应用于更新任务关键型系统上数千行的查询,并且为每一行调用触发器的成本太高,这就是我必须使用规则的原因。我仍然更喜欢获得垃圾输出,而不是受到性能的影响。
CREATE TRIGGER some_table_utrg
BEFORE UPDATE
ON some_table
FOR EACH ROW
EXECUTE PROCEDURE ur_wrapper_trg();