Як відобразити функцію, процедуру, запускає вихідний код у 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 зробить трюк!
Телік

Як бачити функції встановленого розширення? Приклад Я використовую ltree , але відповіді немає \df ltxtquery.
Пітер Краус

\x ONє обов'язковим для перенесення дисплея
andilabs

130

Для функції:

ви можете запитувати перегляд 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

Він покаже вихідний код функції.

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

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

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

Він покаже вам подробиці тригера таблиці. Зазвичай в тригері використовується функція. Таким чином, ви можете отримати вихідний код функції тригера так само, як зазначено вище!


37

Ось кілька прикладів з 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
Використання \xспочатку для ввімкнення розширеного дисплея також допомагає читати.
Кишенькові та

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, у яких порожній_utut_defintion та стан "ВНУТРІШНІЙ" у ​​полі рутинна_тіла. Будь-який натяк, де я можу їх знайти?
alfonx

2
+1 Це більш стандартне / портативне рішення. Для перегляду SQL є:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Франта

Але як бути з випадком, коли ім'я функції не унікальне, оскільки хтось робив функції з тим самим іменем та різними аргументами функції? stackoverflow.com/questions/47341513 / ...
mg1075

@alfonx дивіться pgproc.prosrcколонку
Tomáš Záluský

12

Трохи більше, ніж просто показ функції, як щодо отримання об'єкта для редагування на місці.

\ef <function_name>дуже зручно. Це відкриє вихідний код функції в редагованому форматі. Ви не тільки зможете його переглядати, ви також можете редагувати та виконувати.

Просто \ef без назви функції буде відкрито редагований шаблон CREATE FUNCTION.

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


11

\sf function_name в psql дає редагований вихідний код однієї функції.

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

\ sf [+] function_description Ця команда отримує та показує визначення названої функції у вигляді команди СТВОРИТИ АБО ЗАМОВИТИ ФУНКЦІЮ.

Якщо + до імені команди додається +, то рядки виводу нумеруються, при цьому перший рядок функції функції є рядком 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".

Здається, df для мене не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.