PostgreSQL 函数的深度

Posted

技术标签:

【中文标题】PostgreSQL 函数的深度【英文标题】:Depth of a PostgreSQL function 【发布时间】:2018-09-04 14:57:27 【问题描述】:

我如何知道存储过程的深度(它们在 postgresql 中称为函数),该函数调用另外两个递归函数? 是否有可能知道该函数被调用了很多次。 我想这样做的原因是因为我想切换到迭代方法而不是递归方法,这在我的理解中更有效。

第一个函数如下:

CREATE OR REPLACE FUNCTION public.generategrid(parameters)
 RETURNS SETOF text AS
$BODY$

DECLARE
      /* input params */

BEGIN
      execute generaterowandcols(parameters)
END;

$BODY$

如上所述,它调用另一个函数

CREATE OR REPLACE FUNCTION public.generaterowandcols(parameters)
$BODY$

DECLARE
      /* input params */

BEGIN
      execute generaterow(parameters)

      execute generaterowandcols(parameters)
END;

$BODY$

之前的函数调用下面的函数

CREATE OR REPLACE FUNCTION public.generaterow(parameters)
$BODY$

DECLARE
      /* input params */

BEGIN
      execute generaterow(parameters)

END;

$BODY$

【问题讨论】:

你为什么认为你需要知道这一点?您试图解决的根本问题是什么? 我编辑了我的问题 合法语法而不是伪代码会更有用。你似乎有工作功能 - 我假设 plpgsql?你忘了声明你的 Postgres 版本。 是的,你是对的 plpgsql,版本是 9.6 【参考方案1】:

使用 pg_trigger_depth() 内置函数... ...但这是用于触发功能。

CREATE OR REPLACE FUNCTION func() RETURNS void AS $$
BEGIN
    IF pg_trigger_depth() <> 1 THEN
        RAISE NOTICE pg_trigger_depth();
    END IF;
END;
$$ LANGUAGE plpgsql;

【讨论】:

【参考方案2】:

使用GET STACKED DIAGNOSIS 获取包含调用堆栈的PG_CONTEXT

【讨论】:

以上是关于PostgreSQL 函数的深度的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 函数的深度

postgresql 安装

Pacemaker+Corosync搭建PostgreSQL集群

PostgreSQL备机checkpoint

PostgreSQL 将数据库存储在哪里?

PostgreSQL 将数据库存储在哪里?