如何在 postgresql 中获取完整的函数定义脚本?

Eri*_*984 2 postgresql function

我正在尝试获取函数的完整定义文本,但是每个人都建议的查询返回没有页眉和页脚部分的函数脚本。

这是我正在使用的:

select prosrc from pg_proc where proname='my_func';
Run Code Online (Sandbox Code Playgroud)

这是返回的内容:

DECLARE
some_var1 TEXT;
some_var2 TEXT;
Status character varying;

BEGIN
--SCRIPT CODE HERE

RETURN retval;
END;
Run Code Online (Sandbox Code Playgroud)

但我想要的是这个:

CREATE OR REPLACE FUNCTION my_func(logdate_utc date)
RETURNS character varying
LANGUAGE 'plpgsql'

COST 100
VOLATILE 
AS $BODY$
DECLARE
some_var1 TEXT;
some_var2 TEXT;
Status character varying;

BEGIN
--SCRIPT CODE HERE

RETURN retval;
END;
$BODY$;

ALTER FUNCTION my_func(date)
    OWNER TO some_owner;
Run Code Online (Sandbox Code Playgroud)

找了一圈也没找到多少。我怎样才能得到这个结果?

Abe*_*sto 6

使用 SQL:

 select pg_catalog.pg_get_functiondef('my_func(date)'::regprocedure::oid);
Run Code Online (Sandbox Code Playgroud)

文件

请注意,regprocedure如果指定参数列表,则应使用type,如果regproc仅指定函数名称(如'my_func'::regproc::oid),则应使用type

并使用psql带有\sf元命令的命令行:

此命令以 CREATE OR REPLACE FUNCTION 命令的形式获取并显示命名函数的定义。定义打印到当前查询输出通道,由 \o 设置。

目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如 foo(integer, text)。如果有多个同名函数,则必须给出参数类型。

文档中

例如:

psql -c '\sf my_func(date)'
Run Code Online (Sandbox Code Playgroud)

要检索函数的所有者名称,您可以使用下一个查询:

select proowner::regrole
from pg_proc
where oid = 'my_func(date)'::regprocedure;
Run Code Online (Sandbox Code Playgroud)


kli*_*lin 6

使用pg_get_functiondef(func_oid)

SELECT pg_get_functiondef('my_func'::regproc);
Run Code Online (Sandbox Code Playgroud)