PL / pgSQL,如何使用提升通知创建函数并将来自控制台的消息导出到代码中的文本文件

时间:2015-07-11 02:46:11

标签: postgresql stored-procedures plpgsql

我必须制作一个具有多种条件的更新功能

BEGIN
  OPEN cur3 FOR execute('select id_organigramme from ( select distinct  id_personne,id_organigramme,idfax  from requpdate where
    id_personne= ' || VariableIDpersonne || ' and idfax is  null) a where
    a.id_organigramme not in (select distinct   id_organigramme  from
    requpdate where id_personne= ' ||VariableIDpersonne || ' and idfax is
    not null and a.id_personne=requpdate.id_personne )  ');
  LOOP
    FETCH cur3 INTO VariableIDorganigrammeFax;

    if not found then
      --Message here !!!
      --Raise notice 'hello word!'   
      exit;
    end if;

如果存在任何条件,我必须显示消息我发现我可以使用Raise Notice / info ...语句执行此操作,但是当函数完成时我必须将这些消息自动导出到文本文件中。 这可能吗?否则我可以用它做什么。

我使用PGAdminIII作为客户。

1 个答案:

答案 0 :(得分:1)

您的日志记录选项完全取决于您的客户端配置。但是,我建议您使用NOTIFY \ LISTEN框架,而不是使用RAISE NOTICE。基本上,在您的功能中,您可以向您选择的频道发出通知(可以是任何字符串),并在您的客户端中收听相同的频道,将消息记录为他们进来了。听力和测井的确切程度取决于你的客户。

您展示的代码也可以使用一些改进。

首先,您的查询是一个令人难以置信的复杂版本:

SELECT DISTINCT id_organigramme
FROM requpdate
WHERE id_personne = VariableIDpersonne
  AND idfax IS NULL;

其次,您不需要动态查询,可以使用变量替换。假设id_personne不是字符串,它就像上面说的一样简单,否则使用quote_literal(VariableIDpersonne)

最后,除非您的部分功能未显示需要cursor,否则您只需执行以下操作:

FOR VariableIDorganigrammeFax IN [query above]
LOOP
  ... -- do your processing here
END LOOP;

IF NOT FOUND THEN  -- the loop above did not iterate because no records were returned
  SELECT pg_notify('logMyFunction', format('%s: No records found', VariableIDpersonne));
END IF;

pg_notify()函数是NOTIFY命令的包装器,可以传递变量字符串。

在调用该函数之前,您应该发出命令LISTEN logMyFunction,以便您的会话将从频道收到通知。