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 函数的深度的主要内容,如果未能解决你的问题,请参考以下文章