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

gan*_*esh 150 postgresql

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

小智 139

\df+psql中为您提供源代码.

  • \ df +比代码输出更多.如果你想要的只是代码,\ sf就可以了! (21认同)
  • 不错的一个:)我建议使用`\ df`来查找函数的名称,然后使用`\ x`来扩展输出,然后使用`\ df + name_of_function` (14认同)
  • 转置显示必须使用“\x ON” (2认同)

fra*_*ncs 124

功能:

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

select proname,prosrc from pg_proc where proname= your_function_name; 
Run Code Online (Sandbox Code Playgroud)

另一种方法是只执行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
Run Code Online (Sandbox Code Playgroud)

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

对于触发器:

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

  • 第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

它将显示表格触发器的详细信息.通常触发器使用函数.所以你可以得到触发函数的源代码,就像我指出的那样!


Sat*_*ish 31

以下是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$
Run Code Online (Sandbox Code Playgroud)

  • 首先使用`\ x`打开扩展显示也有助于提高可读性. (4认同)

Grz*_*ski 20

有很多种可能性.最简单的方法是使用pgAdmin并从SQL窗口获取.但是,如果你想获得这个程序然后examinate pg_procpg_trigger系统目录或routinestriggers从信息架构视图(这是SQL标准的方式,但它可能不包括特别是PostgreSQL特有的所有功能).例如:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';
Run Code Online (Sandbox Code Playgroud)

  • 嗯..我有PGPSQL函数,它有一个空的routine_defintion,并在字段routine_body中声明状态为'EXTERNAL'.有什么提示我可以找到那些? (3认同)
  • +1这是更标准/便携的解决方案.对于视图,SQL是:`SELECT view_definition FROM information_schema.views WHERE table_schema =?AND table_name =?` (2认同)

myt*_*der 10

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

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

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

如需进一步参考 - > https://www.postgresql.org/docs/9.6/static/app-psql.html


And*_*ich 8

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

select 
    prosrc
from pg_trigger, pg_proc
where
 pg_proc.oid=pg_trigger.tgfoid
 and pg_trigger.tgname like '<name>'
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*sov 7

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

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

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

如果在命令名称后附加+,则对输出行进行编号,功能主体的第一行为行1。

  • 显示函数的源代码。\ef 函数名称在可编辑模板中打开它 (2认同)

小智 7

列出所有函数:

select n.nspname as function_schema,
       p.proname as function_name,
       l.lanname as function_language,
       case when l.lanname = 'internal' then p.prosrc
            else pg_get_functiondef(p.oid)
            end as definition,
       pg_get_function_arguments(p.oid) as function_arguments,
       t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype 
where n.nspname not in ('pg_catalog', 'information_schema')
order by function_schema,
             function_name;
Run Code Online (Sandbox Code Playgroud)

现在,如果您想在所有函数中搜索特定单词或文本,请确保替换函数中的文本:

with tbl as (
select n.nspname as function_schema,
       p.proname as function_name,
       l.lanname as function_language,
       case when l.lanname = 'internal' then p.prosrc
            else pg_get_functiondef(p.oid)
            end as definition,
       pg_get_function_arguments(p.oid) as function_arguments,
       t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype 
where n.nspname not in ('pg_catalog', 'information_schema')
)
    select *
    from tbl
    where definition ilike '%word or text you want to search%'
    order by function_schema,
             function_name;
Run Code Online (Sandbox Code Playgroud)


Rav*_*ekh 5

自版本: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".
Run Code Online (Sandbox Code Playgroud)

df 似乎对我不起作用。