如何在 PostgreSQL 中显示函数、过程和触发器的代码?如果有人知道查询以显示他们的代码,请告诉我。
psql
中的
\df+
为您提供源代码。
对于功能:
可以查询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
它将显示该函数的源代码。
对于触发器:
不知道有没有直接获取源码的方法。只要知道下面的方法,也许会对你有帮助!
skytf=> 从 pg_trigger 中选择 tgrelid,其中 tgname='insert_tbl_tmp_trigger'; 特格雷利德 --------- 26599 (1 行)
skytf=> 从 pg_class 中选择 oid,relname,其中 oid=26599; 类 |别名 -------+---------------------------- 26599 | 26599 tbl_tmp (1 行)
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$
有很多可能性。最简单的方法是使用 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';
不仅仅是显示功能,还可以获取就地编辑功能。
\ef <function_name>
非常方便。它将以可编辑格式打开该函数的源代码。
您不仅可以查看它,还可以编辑和执行它。
只需
\ef
不带 function_name 将打开可编辑的 CREATE FUNCTION 模板。
供进一步参考 -> https://www.postgresql.org/docs/9.6/static/app-psql.html
\sf
function_name 生成单个函数的可编辑源代码。
来自 https://www.postgresql.org/docs/9.6/static/app-psql.html:
\sf[+] 函数描述 此命令以 CREATE OR REPLACE FUNCTION 命令的形式获取并显示指定函数的定义。
如果命令名称后附加 +,则输出行将被编号,函数体的第一行为第 1 行。
除了@franc的答案之外,您还可以从sql接口使用它:
select
prosrc
from pg_trigger, pg_proc
where
pg_proc.oid=pg_trigger.tgfoid
and pg_trigger.tgname like '<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 似乎不适合我。
列出所有功能:
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;
例如,您可以使用
\sf显示
my_func()
函数的代码,如下所示:
\sf public.my_func
*备注:
您可以省略架构
public.
。
您还可以使用
\sf
显示过程的代码。
我的回答解释了如何详细显示函数的代码。
并且,您可以使用
pg_get_triggerdef(),pg_trigger显示
my_t
触发器的代码和my_t
触发器的OID(对象标识符),如下所示:
SELECT pg_get_triggerdef((SELECT oid FROM pg_trigger WHERE tgname = 'my_t'));
*备注:
此外,还可以通过
\sv显示
my_v
视图的代码,如下所示:
\sv public.my_v
*备注:
您可以省略架构
public.
。
我的回答详细解释了如何显示视图的代码。