【发布时间】:2013-12-19 12:02:39
【问题描述】:
我试图在 postgres 的触发器中调用一个函数。基本上我有一个功能,
c.check_level(bigint, integer)它返回一个布尔值。
我想在触发器中调用这个函数,如下所示:
CREATE OR REPLACE FUNCTION c.check_level_tg()
RETURNS trigger AS
$BODY$
DECLARE
parent_id int8;
level int;
result bool;
begin
parent_id := NEW.fk_parent;
level := NEW.level;
select * from c.check_category_level(parent_id, level) as result;
if (result) then
return (NEW);
else
return(NULL);
end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION c.check_category_level_tg()
OWNER TO postgres;
当我尝试将数据放入此触发器所在的表中时,我收到一个错误: “错误:查询没有结果数据的目的地提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。上下文:PL/pgSQL 函数”。
函数 c.check_level 在单独运行时可以正常工作。
【问题讨论】:
-
select c.check_category_level(parent_id, level) INTO result; -
谢谢!有用!您想将其添加为答案吗?
-
也许吧。 BTW:我认为隐藏函数内部的逻辑不是一个好主意(函数调用开销会很大)此外,我希望函数内部的(递归?)查询与表相关触发器被触发)
-
我有一些复杂的数据完整性规则需要应用于多个表。的确,我隐藏了逻辑,但作为回报,我只需要编写一次代码。我不关心速度,因为我在表上的读取次数比写入次数要多得多。
-
我知道您不想复制代码。复杂的约束有时需要复杂的解决方案。 (在您的情况下:限制嵌套深度?)您是否考虑过使用由触发器函数维护但带有简单
CHECK约束的金丝雀字段(或表)?
标签: postgresql triggers