如何在postgresql中显示函数,过程,触发源代码?

时间:2011-08-01 12:32:04

标签: postgresql

如何在postgresql中打印函数并触发源代码?如果有人知道查询显示功能,请告诉我,触发源代码。

8 个答案:

答案 0 :(得分:126)

psql 中的

\df+为您提供源代码。

答案 1 :(得分:114)

功能:

您可以查询pg_proc视图,如下所示

select proname,prosrc from pg_proc where proname= your_function_name; 

另一种方法是只执行可以列出函数的commont \df\ef

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

它将显示该函数的源代码。

对于触发器:

我不知道是否有直接获取源代码的方法。只要知道以下方式,可能会对你有帮助!

  • 第1步:获取触发器的表格:
    skytf=> select tgrelid from pg_trigger  where tgname='insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 row)
  • 第2步:获取上述oid的表名!
    skytf=> select oid,relname  from pg_class where oid=26599;
      oid  |           relname           
    -------+-----------------------------
     26599 | tbl_tmp
    (1 row)
  • 第3步:列出表格信息
    skytf=> \d tbl_tmp

它将显示表格触发器的详细信息。通常触发器使用函数。所以你可以像上面提到的那样获得触发函数的源代码!

答案 2 :(得分:25)

以下是PostgreSQL-9.5的几个例子

显示列表:

  1. 功能:\df+
  2. 触发器:\dy+
  3. 显示定义:

    postgres=# \sf
    function name is required
    
    postgres=# \sf pg_reload_conf()
    CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
     RETURNS boolean
     LANGUAGE internal
     STRICT
    AS $function$pg_reload_conf$function$
    
    postgres=# \sf pg_encoding_to_char
    CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
     RETURNS name
     LANGUAGE internal
     STABLE STRICT
    AS $function$PG_encoding_to_char$function$
    

答案 3 :(得分:19)

有很多种可能性。最简单的方法是使用pgAdmin并从SQL窗口获取。但是,如果您希望以编程方式获取此信息,请从信息架构(这是SQL标准方式)检查pg_procpg_trigger系统目录或routinestriggers视图,但它可能不会涵盖所有功能,尤其是PostgreSQL特有的)。例如:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';

答案 4 :(得分:10)

稍微不仅仅是显示功能,如何获得编辑就地设施。

\ef <function_name>非常方便。它将以可编辑格式打开函数的源代码。 您不仅可以查看它,还可以编辑和执行它。

只有\ef没有function_name将打开可编辑的CREATE FUNCTION模板。

供进一步参考 - &gt; https://www.postgresql.org/docs/9.6/static/app-psql.html

答案 5 :(得分:7)

除了@ franc的答案,你可以在sql界面中使用它:

select 
    prosrc
from pg_trigger, pg_proc
where
 pg_proc.oid=pg_trigger.tgfoid
 and pg_trigger.tgname like '<name>'

(取自此处:http://www.postgresql.org/message-id/Pine.BSF.4.10.10009140858080.28013-100000@megazone23.bigpanda.com

答案 6 :(得分:6)

psql中的

\sf function_name产生单个函数的可编辑源代码。

来自https://www.postgresql.org/docs/9.6/static/app-psql.html

  

\ sf [+] function_description   此命令以CREATE OR REPLACE FUNCTION命令的形式获取并显示命名函数的定义。

     

如果+被附加到命令名称,则输出行被编号,函数体的第一行是第1行。

答案 7 :(得分:2)

从版本开始:psql(9.6.17,服务器11.6)

我尝试了以上所有答案,但对我来说

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

df似乎不适合我。