2011-08-01 47 views
100

如何在postgresql中打印函数和触发源代码?请让我知道是否有人知道查询显示功能,触发源代码。如何在postgresql中显示函数,过程,触发源代码?

+5

作为追随者谁来到这里试图找出如何列出所有触发器一张纸条,这是'选择pg_trigger *;'或者,如果你也想看看哪个表中的每一触发器适用于'select tgrelid :: regclass,tgname from pg_trigger;'FWIW ' – rogerdpack

回答

15

有很多可能性。最简单的方法就是使用pgAdmin并从SQL窗口获取它。然而,如果你想以编程方式获得这个信息,那么从信息模式(这是SQL标准方式,但它可能不包括所有功能,特别是PostgreSQL特定的)中检查pg_procpg_trigger系统目录或routines和视图。例如:

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

嗯..我有PGPSQL函数,它有一个空的routine_defintion,并且在field_body域中声明'EXTERNAL'。任何暗示,我可以找到那些? – alfonx

+2

+1这是更标准/便携式解决方案。对于视图SQL是:'SELECT view_definition FROM information_schema.views WHERE table_schema =? AND table_name =?' – Franta

+0

但是,函数名称不是唯一的,因为有人用相同的名称和不同的函数参数来创建函数? https://stackoverflow.com/questions/47341513/postgresql-how-to-display-function-or-trigger-or-view-code-for-a-unique-item – mg1075

94

对于功能:

可以查询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 

它会显示函数的源代码。

对于触发器:

我dont't知道是否有一个直接的方式来获得源代码。只要知道下面的方式,可能会帮助你!

  • 第1步:获取触发器的表OID:
 
    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 

它会告诉你该表的触发器的细节。通常一个触发器使用一个函数。所以你可以得到触发函数的源代码,就像我指出的那样!

+0

如何查看**安装的功能EXTENSION?**示例我正在使用[ltree](https://www.postgresql.org/docs/current/static/ltree.html),但'\ df ltxtquery'没有响应。 –

99

\df+ in psql为您提供源代码。

+13

不错:)我建议使用'\ df'来查找你的函数的名字,然后用'\ x'来扩展输出,然后'\ df + name_of_function' –

+8

\ df +输出比代码更多的东西。如果你想要的只是代码,那么\ sf会诀窍! – Telic

+0

如何查看已安装的EXTENSION的**函数**示例我正在使用[ltree](https://www.postgresql.org/docs/current/static/ltree.html),但没有任何响应, \ df ltxtquery'。 –

16

下面是一些例子和PostgreSQL-9。5

显示列表:

  1. 功能:\df+
  2. 触发器:\dy+

显示清晰度:

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$ 
1

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

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

\ SF [+] function_description 此命令取和显示命名的函数的定义,在CREATE OR REPLACE FUNCTION命令的形式。

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

3

略多于只是显示功能,如何获得编辑就地设施。

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

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

更多参考 - >https://www.postgresql.org/docs/9.6/static/app-psql.html

相关问题