Ответы:
\df+
в PSQL дает вам исходный код.
\df
чтобы найти имя вашей функции, затем \x
для расширенного вывода, затем\df+ name_of_function
\df ltxtquery
.
\x ON
является обязательным
Для функции:
вы можете запросить представление 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 => выберите tgrelid из pg_trigger, где tgname = 'insert_tbl_tmp_trigger'; tgrelid --------- 26599 (1 ряд)
skytf => выберите oid, relname из pg_class, где oid = 26599; oid | relname ------- + ----------------------------- 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$
\x
first для включения расширенного отображения также помогает с удобочитаемостью.
Есть много возможностей. Самый простой способ - просто использовать 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 = ?
pgproc.prosrc
колонку
Чуть больше, чем просто отображение функции, как насчет получения возможности редактирования на месте.
\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 [+] function_description Эта команда выбирает и показывает определение именованной функции в форме команды 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>'
(взято здесь: http://www.postgresql.org/message-id/Pine.BSF.4.10.10009140858080.28013-100000@megazone23.bigpanda.com )
Начиная с версии: 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".
ДФ, кажется, не работает для меня.
select * from pg_trigger;
или, если вы также хотите увидеть, к какой таблице каждый триггер относится кselect tgrelid::regclass, tgname from pg_trigger;
FWIW `