【问题标题】:Calling a function with a boolean return value inside of a trigger in postgres在 postgres 的触发器内调用具有布尔返回值的函数
【发布时间】: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


【解决方案1】:

改变

select * from c.check_category_level(parent_id, level) as result;

进入:

SELECT c.check_category_level(parent_id, level) INTO result;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多