\df+
在psql中可以获得源代码。
\df
来查找您的函数名称,然后使用\x
来展开输出,最后使用\df+ 函数名称
来获取更详细的信息。 - Sam Watkins\x ON
是转置显示的必要条件。 - andilabs对于函数:
你可以查询 pg_proc
视图,如下所示:
select proname,prosrc from pg_proc where proname= your_function_name;
另一种方法是执行常用的命令\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
它将显示函数的源代码。
对于触发器:
我不知道是否有直接获取源代码的方法。只知道以下方法,也许能帮到你!
skytf=> select tgrelid from pg_trigger where tgname='insert_tbl_tmp_trigger'; tgrelid --------- 26599 (1 row)
skytf=> select oid,relname from pg_class where oid=26599; oid | relname -------+----------------------------- 26599 | tbl_tmp (1 row)
skytf=> \d tbl_tmp
它将显示您的表触发器的详细信息。通常触发器使用函数。因此,您可以按照我上面指出的方式获得触发器函数的源代码!
以下是来自PostgreSQL-9.5的几个示例
显示列表:
\df+
\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$
\x
首先打开扩展显示也有助于提高可读性。 - Pocketsand\sf shared.is_authorized()
)会失败并显示“函数...不存在”,而省略括号则可以正常工作(例如,\sf shared.is_authorized
)。 (psql 12.9) - Glenn有很多可能性。最简单的方法是使用pgAdmin并从SQL窗口中获取此信息。但是,如果您想以编程方式获取此信息,请检查pg_proc
和 pg_trigger
系统目录或来自信息模式的 routines
和 triggers
视图(这是SQL标准方式,但可能不覆盖所有特性,特别是针对PostgreSQL的)。例如:
SELECT
routine_definition
FROM
information_schema.routines
WHERE
specific_schema LIKE 'public'
AND routine_name LIKE 'functionName';
SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
。 - Frantapgproc.prosrc
列。 - Tomáš Záluský除了仅显示函数外,还可以获得原地编辑功能。
\ef <function_name>
非常方便。它将以可编辑格式打开函数的源代码。您不仅可以查看它,还可以编辑和执行它。
只需使用\ef
而不使用function_name,则会打开可编辑的CREATE FUNCTION模板。
更多参考资料 -> https://www.postgresql.org/docs/9.6/static/app-psql.html
\sf
函数在psql中会返回单个函数的可编辑源代码。
来自https://www.postgresql.org/docs/9.6/static/app-psql.html:
\sf[+] 函数描述 此命令获取并显示指定函数的定义,格式为CREATE OR REPLACE FUNCTION命令。
如果在命令名称后添加+,则输出行将编号,函数正文的第一行为第1行。
select
prosrc
from pg_trigger, pg_proc
where
pg_proc.oid=pg_trigger.tgfoid
and pg_trigger.tgname like '<name>'
这是一个关于IT技术的文章。请注意,本文中可能包含一些HTML标签。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;
如果您想在所有函数中搜索特定单词或文本,方法如下,请确保将您的文本替换为以下函数中的文本:
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;
自版本: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命令似乎无法正常工作。
psql --version
打印出类似于10.x的版本,而服务器是11+时。https://dba.stackexchange.com/a/238906 - Falco Preiseni
select * from pg_trigger;
进行查询,或者如果你想查看每个触发器所应用的表,可以使用select tgrelid::regclass, tgname from pg_trigger;
。顺便提一下。 - rogerdpack\sf
(下面的解释)是查看函数源代码的最佳方式。 - Peter Krauss