在 PostgreSQL 中显示完整的存储过程代码?

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

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

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

使用 Postgres 版本 8.4.1

database postgresql stored-procedures plpgsql function-definition
15个回答
291
投票

\df+ <function_name>
psql


186
投票
psql 中的

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


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

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


25
投票

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


18
投票

使用

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

11
投票

PostgreSQL 9.1

\sf
可用。


7
投票
\sf function_name

(末尾不要加分号)


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

0
投票

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

第 1 步:选择您的数据库

第2步:点击查找按钮

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

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


0
投票

我们可以使用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


0
投票

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


0
投票

我用:

\sf <function name>

0
投票

例如,您创建

my_proc()
过程,如下所示。 *我的文章解释了如何创建 PL/pgSQL 过程:

CREATE PROCEDURE my_proc(IN value INTEGER, OUT result INTEGER)
LANGUAGE plpgsql
AS $$
BEGIN
  SELECT 2 + value INTO result;
END;
$$;

然后,您可以使用

\sf
显示my_proc()的代码,如下所示。 *
+
可以显示行号:

postgres=# \sf my_proc
CREATE OR REPLACE PROCEDURE public.my_proc(IN value integer, OUT result integer)
 LANGUAGE plpgsql
AS $procedure$
BEGIN
  SELECT 2 + value INTO result;
END;
$procedure$

postgres=# \sf+ my_proc
           CREATE OR REPLACE PROCEDURE public.my_proc(IN value integer, OUT result integer)
            LANGUAGE plpgsql
1          AS $procedure$
2          BEGIN
3            SELECT 2 + value INTO result;
4          END;
5          $procedure$

或者,您可以使用

pg_get_functiondef()
显示 my_proc() 的代码和
my_proc()
的 OID,如下所示。 *我的文章解释了如何通过类型转换获取函数的OID(对象标识符):

postgres=# SELECT pg_get_functiondef('my_proc'::regproc);
                                pg_get_functiondef
----------------------------------------------------------------------------------
 CREATE OR REPLACE PROCEDURE public.my_proc(IN value integer, OUT result integer)+
  LANGUAGE plpgsql                                                               +
 AS $procedure$                                                                  +
 BEGIN                                                                           +
   SELECT 2 + value INTO result;                                                 +
 END;                                                                            +
 $procedure$                                                                     +

(1 row)

或者,您可以使用

pg_proc
仅显示 my_proc() 的主体代码,如下所示:

postgres=# SELECT prosrc FROM pg_proc WHERE proname = 'my_proc';
             prosrc
---------------------------------
                                +
 BEGIN                          +
   SELECT 2 + value INTO result;+
 END;                           +

(1 row)

或者,您可以使用

information_schema.routines
仅显示 my_proc() 的代码,如下所示:

postgres=# SELECT routine_definition FROM information_schema.routines WHERE routine_name = 'my_proc';

       routine_definition
---------------------------------
                                +
 BEGIN                          +
   SELECT 2 + value INTO result;+
 END;                           +

(1 row)

-3
投票

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

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

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