需要有关Postgres触发器和功能的帮助

时间:2013-03-25 21:46:34

标签: function postgresql triggers plpgsql

我有一个查找表,其中包含一列来源(来自我创建的Web服务API捕获的各种硬编码广告系列)以及应与之关联的各个品牌。这样我就可以为品牌为空的记录提供一个品牌 - 这样他们就可以通过营销自动化工具通过某个模板进行欢迎。

我最终弃用此API并将其替换为需要品牌的API,但与此同时我必须制定临时解决方案,直到我让所有品牌团队有时间更改其API调用。

我写了这个函数:

CREATE OR REPLACE FUNCTION public.brand_lookup(IN i_brand TEXT )
  RETURNS SETOF RECORD VOLATILE AS
$$
BEGIN
   RETURN QUERY
     UPDATE subscriber
     SET brand = (SELECT brand FROM brand_translation
                  WHERE source = subscriber.source);
END;
$$
LANGUAGE plpgsql;

插入记录时触发该函数的触发器:

CREATE TRIGGER brand_translation 
  AFTER INSERT ON subscriber
  FOR EACH ROW EXECUTE PROCEDURE public.brand_lookup();

但我的触发器返回错误“错误:函数public.brand_lookup()不存在”(但它成功创建)“。除了我的触发器没有看到我的函数的事实,该函数会做我的意图是什么?我在功能方面相当不错(你可能会说)。

2 个答案:

答案 0 :(得分:2)

可能会这样:

CREATE OR REPLACE FUNCTION public.f_brand_lookup()
   RETURNS trigger AS
$func$
BEGIN
   SELECT INTO NEW.brand
          bt.brand
   FROM   brand_translation bt
   WHERE  bt.source = NEW.source;

   RETURN NEW;
END
$func$
LANGUAGE plpgsql;

CREATE TRIGGER brand_insert_before_lookup
BEFORE INSERT ON subscriber
FOR EACH ROW EXECUTE PROCEDURE public.f_brand_lookup();

你的例子太完全错了。
您需要从学习基础知识开始。一如既往,我建议使用非常精细的手册 开始herehere

答案 1 :(得分:0)

Postres允许根据输入参数重载函数 - 因此当您在没有参数的情况下调用public.brand_lookup()时,找不到您创建的函数 - public.brand_lookup(text)。我认为你需要在调用函数时传递必要的参数,或者删除函数定义中的参数。