Как отобразить функцию, процедуру, запускает исходный код в postgresql?

168

Как распечатать исходные коды функций и триггеров в postgresql? пожалуйста, дайте мне знать, если кто-нибудь знает запрос для отображения функции, запускает исходный код.

Ганеша
источник
11
в качестве заметки для последователей, которые пришли сюда, пытаясь выяснить, как перечислить все триггеры, это select * from pg_trigger;или, если вы также хотите увидеть, к какой таблице каждый триггер относится к select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Ответы:

152

\df+в PSQL дает вам исходный код.

Матеуш Гротек
источник
17
Хороший :) Я предлагаю использовать, \dfчтобы найти имя вашей функции, затем \xдля расширенного вывода, затем\df+ name_of_function
Сэм Уоткинс
33
\ df + выводит намного больше, чем код. Если вам нужен только код, \ sf поможет вам!
Telic
Как увидеть функции установленного расширения? Пример Я использую ltree , но ответа нет \df ltxtquery.
Питер Краусс
\x ONявляется обязательным
условием
130

Для функции:

вы можете запросить представление 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

Он покажет исходный код функции.

Для триггеров:

Я не знаю, есть ли прямой способ получить исходный код. Просто знайте следующий способ, может быть, он вам поможет!

  • Шаг 1: Получить таблицу oid триггера:
    skytf => выберите tgrelid из pg_trigger, где tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 ряд)
  • Шаг 2: Получить имя таблицы вышеупомянутого oid!
    skytf => выберите oid, relname из pg_class, где oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 ряд)
  • Шаг 3: список информации о таблице
    skytf => \ d tbl_tmp

Он покажет вам детали триггера таблицы. Обычно триггер использует функцию. Таким образом, вы можете получить исходный код функции триггера, как указано выше!

франки
источник
38

Вот несколько примеров из 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$
Sathish
источник
7
Использование \xfirst для включения расширенного отображения также помогает с удобочитаемостью.
Карманы и
26

Есть много возможностей. Самый простой способ - просто использовать 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';
Гжегож Шпетковски
источник
3
Мммм ... У меня есть функции PGPSQL, у которых есть пустое рутинное_определение, и состояние 'EXTERNAL' в поле рутинное_ тело. Любой намек, где я могу найти их?
alfonx
2
+1 Это более стандартное / переносимое решение. Для воззрений SQL является:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta
Но как насчет случая, когда имя функции не уникально, потому что кто-то создал функции с одинаковым именем и разными аргументами функции? stackoverflow.com/questions/47341513/…
mg1075
@alfonx см. pgproc.prosrcколонку
Томаш Залуски
12

Чуть больше, чем просто отображение функции, как насчет получения возможности редактирования на месте.

\ef <function_name>очень удобно Откроется исходный код функции в редактируемом формате. Вы сможете не только просматривать его, но и редактировать и исполнять.

Просто \efбез function_name откроется редактируемый шаблон CREATE FUNCTION.

Для дальнейшего ознакомления -> https://www.postgresql.org/docs/9.6/static/app-psql.html

mythicalcoder
источник
11

\sf имя_функции в psql возвращает редактируемый исходный код одной функции.

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

\ sf [+] function_description Эта команда выбирает и показывает определение именованной функции в форме команды CREATE OR REPLACE FUNCTION.

Если к имени команды добавляется +, выходные строки нумеруются, а первая строка тела функции - строка 1.

Сергей Тарасов
источник
показывает исходный код функции. \ ef имя функции открывает его в редактируемом шаблоне
amar
0

Начиная с версии: 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".

ДФ, кажется, не работает для меня.

Рави Парех
источник