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

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
16

Используйте \dfдля вывода списка всех хранимых процедур в Postgres.

Пунит Пурохит
источник
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>'
Msciwoj
источник
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
Developer_Suraj
источник
Нет sp_helptextв postgresql.
GSerg
-2

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

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

аннаката
источник
2
Только командная строка - никакого приложения для управления. Если pgAdmin может это сделать, он должен использовать какую-то команду - я просто не могу найти никакой документации по этому поводу. Я просматриваю таблицы pg_ *, но ни одна из них не выделяется.
Даррен
Рад, что вы нашли ответ, но не знаете, почему усложняете себе жизнь! Почему бы просто не установить pgAdmin?
annakata
7
При удаленном подключении к базе данных в сеансе ssh запустить приложение управления непросто.
jutky