как отобразить полный код хранимой процедуры?


113

Как вы просматриваете хранимую процедуру / функцию?

Скажем, у меня есть старая функция без исходного определения - я хочу посмотреть, что она делает в pg / psql, но я не могу найти способ сделать это.

с использованием Postgres версии 8.4.1

Ответы:


19

используйте pgAdmin или используйте pg_proc, чтобы получить источник ваших хранимых процедур. pgAdmin делает то же самое.


3
pg_proc вот и все! Уфф, я рад, что они сэкономили несколько байтов места, не назвав его pg_procedure ... боже. :)
Даррен

14
Достаточно легко узнать, какие запросы использует psql для получения этой информации (например, для команды \ df), запустив psql с параметром --echo-hidden. Это покажет все запросы, которые используются внутри. pg_proc не хранит полный оператор CREATE FUNCTION. Вы можете использовать pg_get_functiondef () для получения полного источника.
a_horse_with_no_name

5
на всякий случай кто-то не понимает, где находится эта таблица: pg_catalog -> system table -> pg_proc
Димитрис

244

\df+ <function_name>в psql .


6
Есть ли способ красиво распечатать это? Я спрашиваю, потому что это делает его нечитаемым.
12hys,

3
Для меня это довольно напечатано. Помните, что если вы делаете это в psql интерактивно и строки обертываются, а пейджер запускается, вы можете отключить обернутые строки, набрав '-S' (то же, что и аргумент командной строки 'less'), а затем используйте клавиши со стрелками для прокрутки вокруг.
Джонатан Хартли

10
Для наглядности вы можете использовать \x мета-команду psql перед отображением определения функции. \xтакже полезен для просмотра результатов запроса, содержащих записи с длинными строками.
Stew

149

\ef <function_name>в psql. Это даст всю функцию с редактируемым текстом.


2
Точный ответ. Это откроет определение функции в редакторе.
Ponnusamy K

2
Это лучший ответ! Он показывает определение функции в удобочитаемой форме.
faramka

3
Не забудьте ввести ; <enter>после, чтобы выполнить буфер.
благоухающий

4
ERROR: more than one function named
Брайан Каннард,

64
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Это сообщает обработчику функции, как вызывать функцию. Это может быть фактический исходный код функции для интерпретируемых языков, символ ссылки, имя файла или что-то еще, в зависимости от языка реализации / соглашения о вызовах.


Это полезно. Есть ли способ получить красивую печать?
Setjmp

Это полезно, потому что не требует psql. Обратите внимание, что имена функций отображаются в нижнем регистре.
Шеймус Абшир

@Maxim, вы знаете, как определить возвращаемый тип и входные аргументы?
Fivell

@Fivell, для всего ARG имен, а не типов: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Это по крайней мере на Pg 9.6. Вы можете получить числовой код типа через свойство proargtypes, но вам нужно будет присоединиться к какой-либо другой таблице, чтобы получить это как имена.
Thalis K. 08


10

Если кому-то интересно, как быстро запросить таблицы каталога и использовать эту pg_get_functiondef()функцию, вот пример запроса:

SELECT n.nspname AS schema
      ,proname AS fname
      ,proargnames AS args
      ,t.typname AS return_type
      ,d.description
      ,pg_get_functiondef(p.oid) as definition
--      ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
--            ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
--       END as definition
  FROM pg_proc p
  JOIN pg_type t
    ON p.prorettype = t.oid
  LEFT OUTER
  JOIN pg_description d
    ON p.oid = d.objoid
  LEFT OUTER
  JOIN pg_namespace n
    ON n.oid = p.pronamespace
 WHERE NOT p.proisagg
   AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
   AND proname~'<$FUNCTION_NAME_PATTERN>'

pg_get_functiondef (), похоже, не обрабатывает определяемые пользователем агрегатные функции. Когда я получаю ОШИБКУ: «гистограмма» - это агрегатная функция, когда я запрашиваю UDA
Тим Чайлд

2
[42809] ОШИБКА: "array_agg" - агрегатная функция
Дэниел Л. ВанДенБош

1
@ DanielL.VanDenBosch исправил (чтобы просто исключить агрегатные функции)
msciwoj

Вы спасли мне жизнь ... pg_get_functiondef () можно использовать для поиска процедур с конкретным словом в определенииpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero

0

Вы также можете получить с помощью phpPgAdmin, если вы настроили его в своей системе,

Шаг 1. Выберите свою базу данных

Шаг 2: нажмите кнопку поиска

Шаг 3: Измените параметр поиска на функции, затем нажмите «Найти».

Вы получите список определенных функций. Вы также можете искать функции по имени, надеюсь, этот ответ поможет другим.


-1

Чтобы увидеть полный код (запрос), написанный в хранимой процедуре / функциях, используйте команду ниже:

sp_helptext procedure/function_name

для имени функции и имени процедуры не добавляйте префикс «dbo». или sys.

не добавляйте скобки в конце имени процедуры или функции, а также не передавайте параметры.

используйте ключевое слово sp_helptext, а затем просто передайте имя процедуры / функции.

используйте команду ниже, чтобы увидеть полный код, написанный для процедуры:

sp_helptext ProcedureName

используйте команду ниже, чтобы увидеть полный код, написанный для функции:

sp_helptext FunctionName

Нет sp_helptextв postgresql.
GSerg

-2

Обычно вы используете приложение-менеджер БД, такое как pgAdmin , переходите к интересующему вас объекту и щелкаете правой кнопкой мыши, чтобы выбрать «сценарий как создать» или аналогичный.

Вы пытаетесь сделать это ... без приложения для управления?


2
Только командная строка - никакого приложения для управления. Если pgAdmin может это сделать, он должен использовать какую-то команду - я просто не могу найти никакой документации по этому поводу. Я просматриваю таблицы pg_ *, но ни одна из них не выделяется.
Даррен

Рад, что вы нашли ответ, но не знаете, почему усложняете себе жизнь! Почему бы просто не установить pgAdmin?
annakata

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