如何显示函数或过程的完整定义?

问题描述 投票:0回答:13

如何查看存储函数或过程?

假设我有一个没有原始定义的旧函数 - 我想看看它在做什么,但我似乎无法找到一种方法来做到这一点。

使用 Postgres 版本 8.4.1。

database postgresql stored-procedures plpgsql function-definition
13个回答
299
投票

\df+ <function_name>
psql


195
投票
psql 中的

\ef <function_name>
。它将为整个功能提供可编辑的文本。


94
投票
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

这告诉函数处理程序如何调用该函数。它可能是解释语言函数的实际源代码、链接符号、文件名或其他任何内容,具体取决于实现语言/调用约定


25
投票

使用 pgAdmin 或使用 pg_proc 获取存储过程的源代码。 pgAdmin 也做同样的事情。


19
投票

使用

\df
列出 Postgres 中的所有存储过程。


14
投票

如果有人想知道如何快速查询目录表并使用

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>'

13
投票

PostgreSQL 9.1

\sf
可用。


8
投票
\sf function_name

(末尾不要加分号)


3
投票
SELECT pg_get_functiondef(( SELECT oid 
                            FROM   pg_proc
                            WHERE  proname = 'function_name' ));

2
投票

*在这个答案中,我介绍了几种显示函数代码的方法,如下所示,但您也可以使用下面这些方法来显示过程代码。

例如,您创建

my_func()
函数,如下所示。

CREATE FUNCTION my_func(v1 INT, v2 INT) RETURNS INT
AS $$
BEGIN
  RETURN v1 + v2;
END;
$$ LANGUAGE plpgsql;

然后就可以用

\sf
来显示my_func()的代码,如下所示:

postgres=# \sf public.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+ public.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$

*备注:

  • +
    可以显示行号。

  • 您可以省略架构

    public.

或者,您可以使用

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.

或者,您可以使用 [pg_proc][4] 仅显示

my_func()
的主体代码,如下所示:

postgres=# SELECT prosrc FROM pg_proc WHERE proname = 'my_func';
      prosrc
-------------------
                  +
 BEGIN            +
   RETURN v1 + v2;+
 END;             +

(1 row)

postgres=# SELECT prosrc FROM pg_proc WHERE oid = 'public.my_func'::regproc;
      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)

0
投票

如果您的系统中配置了 phpPgAdmin,也可以通过 phpPgAdmin 获取,

第 1 步:选择您的数据库

第2步:点击查找按钮

第 3 步:将搜索选项更改为函数,然后单击“查找”。

您将获得已定义函数的列表。您也可以按名称搜索函数,希望这个答案对其他人有帮助。


0
投票

jdbcTemplate.queryForList("SELECT routine_name FROM information_schema.routines WHERE routine_type = 'PROCEDURE'", String.class);


-3
投票

通常来说,您会使用像pgAdmin这样的数据库管理器应用程序,浏览到您感兴趣的对象,然后右键单击“脚本创建”或类似的方式。

您是否想在没有管理应用程序的情况下执行此操作?

© www.soinside.com 2019 - 2024. All rights reserved.