4

我有一个查找表,其中包含一列来源(来自通过我创建的 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() 不存在”(但它创建成功)“。除了我的触发器看不到我的函数这一事实之外,该函数会执行我的操作吗?我打算吗?我对函数相当陌生(正如你可能知道的那样)。

4

2 回答 2

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();

您的示例完全错误。
您需要从学习基础知识开始。与往常一样,我建议使用非常精美的手册。从这里这里
开始。

于 2013-03-25T23:38:53.217 回答
0

Postres 允许根据输入参数重载函数——所以当你public.brand_lookup()不带参数调用时,你创建的函数public.brand_lookup(text)——找不到。我认为你需要在函数调用中传递必要的参数,或者在函数定义中删除参数。

于 2013-03-25T21:56:26.807 回答