Как отобразить функцию, процедуру, запускает исходный код в 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$

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


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".

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.