如何查看存储函数或过程?
假设我有一个没有原始定义的旧函数 - 我想看看它在 pg/psql 中做什么,但我似乎无法找到一种方法来做到这一点。
使用 Postgres 版本 8.4.1
\df+ <function_name>
在 psql。
\ef <function_name>
。它将为整个功能提供可编辑的文本。
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';
这告诉函数处理程序如何调用该函数。它可能是解释语言函数的实际源代码、链接符号、文件名或其他任何内容,具体取决于实现语言/调用约定
使用 pgAdmin 或使用 pg_proc 获取存储过程的源代码。 pgAdmin 也做同样的事情。
使用
\df
列出 Postgres 中的所有存储过程。
如果有人想知道如何快速查询目录表并使用
pg_get_functiondef()
函数,这里是示例查询:
SELECT n.nspname AS schema
,proname AS fname
,proargnames AS args
,t.typname AS return_type
,d.description
,pg_get_functiondef(p.oid) as definition
-- ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
-- ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
-- END as definition
FROM pg_proc p
JOIN pg_type t
ON p.prorettype = t.oid
LEFT OUTER
JOIN pg_description d
ON p.oid = d.objoid
LEFT OUTER
JOIN pg_namespace n
ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
AND proname~'<$FUNCTION_NAME_PATTERN>'
\sf
可用。
\sf function_name
(末尾不要加分号)
SELECT pg_get_functiondef(( SELECT oid
FROM pg_proc
WHERE proname = 'function_name' ));
如果您的系统中配置了 phpPgAdmin,也可以通过 phpPgAdmin 获取,
第 1 步:选择您的数据库
第2步:点击查找按钮
第 3 步:将搜索选项更改为函数,然后单击“查找”。
您将获得已定义函数的列表。您也可以按名称搜索函数,希望这个答案对其他人有帮助。
我们可以使用pg_get_functiondef()命令来获取proc的完整函数代码。同样使用下面的代码创建宏,我们可以将其用作获取功能代码的快捷键。 尝试此方法来显示完整的 postgresql 基金代码。
DO
$$
DECLARE
v_Inputtext TEXT;
v_output text;
BEGIN
v_Inputtext := (SELECT lower('procedurename'));
v_output := (SELECT pg_get_functiondef(oid) FROM pg_catalog.pg_proc WHERE proname = v_Inputtext);
RAISE NOTICE '%',v_output;
END;
$$
https://www.novicetechie.com/2020/01/how-to-display-full-postgresql-function.html
jdbcTemplate.queryForList("SELECT routine_name FROM information_schema.routines WHERE routine_type = 'PROCEDURE'", String.class);
*在这个答案中,我介绍了几种显示函数代码的方法,如下所示,但您也可以使用下面这些方法来显示过程代码。
例如,您创建
my_func()
函数,如下所示。 *我的帖子解释了如何创建 PL/pgSQL 函数:
CREATE FUNCTION my_func(v1 INTEGER, v2 INTEGER) RETURNS INTEGER
AS $$
BEGIN
RETURN v1 + v2;
END;
$$ LANGUAGE plpgsql;
然后,您可以使用
\sf显示
my_func()
的代码,如下所示。 *+
可以显示行号:
postgres=# \sf my_func
CREATE OR REPLACE FUNCTION public.my_func(v1 integer, v2 integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN v1 + v2;
END;
$function$
postgres=# \sf+ my_func
CREATE OR REPLACE FUNCTION public.my_func(v1 integer, v2 integer
)
RETURNS integer
LANGUAGE plpgsql
1 AS $function$
2 BEGIN
3 RETURN v1 + v2;
4 END;
5 $function$
或者,您可以使用
pg_get_functiondef()显示
my_func()
的代码和 my_func()
的 OID,如下所示:
postgres=# SELECT pg_get_functiondef('public.my_func'::regproc);
pg_get_functiondef
-------------------------------------------------------------------
CREATE OR REPLACE FUNCTION public.my_func(v1 integer, v2 integer)+
RETURNS integer +
LANGUAGE plpgsql +
AS $function$ +
BEGIN +
RETURN v1 + v2; +
END; +
$function$ +
(1 row)
*备注:
您可以省略架构
public.
。
我的文章解释了如何通过类型转换获取函数的OID(对象标识符)。
或者,您可以使用
pg_proc仅显示
my_func()
的主体代码,如下所示:
postgres=# SELECT prosrc FROM pg_proc WHERE proname = 'my_func';
prosrc
-------------------
+
BEGIN +
RETURN v1 + v2;+
END; +
(1 row)
或者,您可以使用
information_schema.routines仅显示
my_func()
的代码,如下所示:
postgres=# SELECT routine_definition FROM information_schema.routines WHERE routine_name = 'my_func';
routine_definition
--------------------
+
BEGIN +
RETURN v1 + v2; +
END; +
(1 row)
通常来说,您会使用像pgAdmin这样的数据库管理器应用程序,浏览到您感兴趣的对象,然后右键单击“脚本创建”或类似的方式。
您是否想在没有管理应用程序的情况下执行此操作?