як відобразити повний збережений код процедури?


111

Як ви переглядаєте збережену процедуру / функцію?

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

використовуючи Postgres версії 8.4.1

Відповіді:


19

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


3
pg_proc це все! Хоча я радий, що вони заощадили кілька байтів місця, не називаючи його pg_procedure ... да. :)
darren

14
Визначити, які запити psql використовує для отримання цієї інформації (наприклад, для команди \ df), досить легко, запустивши psql з параметром --echo-прихований. Це покаже всі запити, які використовуються внутрішньо. pg_proc не зберігає повний оператор CREATE FUNCTION. Ви можете використовувати pg_get_functiondef () для отримання повного джерела.
a_horse_with_no_name

5
на всякий випадок, коли когось плутають, де знаходиться ця таблиця: pg_catalog -> системна таблиця -> pg_proc
Димитріс

242

\df+ <function_name>в psql .


6
Чи є спосіб, як це надрукувати? Причина, яку я прошу, полягає в тому, що це робить її нечитабельною.
год.

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

10
Для розбірливості ви можете використовувати \x метакоманду psql перед відображенням визначення функції. \xтакож корисний для перегляду результатів запитів, що містять записи з довгими рядками.
Тушковане

149

\ef <function_name>в psql. Це дасть всю функцію з редагованим текстом.


2
Точна відповідь. Це відкриє визначення функції в редакторі.
Ponnusamy K

2
Це найкраща відповідь! Він показує визначення функції в читабельному вигляді.
faramka

3
Не забудьте ввести ; <enter>після виконання буфера.
повторно

4
ERROR: more than one function named
Брайан Хаак

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

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


Це корисно. Чи є спосіб мати вихідний друк?
Setjmp

Це корисно, оскільки цього не потрібно psql. Зверніть увагу, що назви функцій видаються зменшеними.
Seamus Abshere

@Maxim, чи знаєте ви, як виявити тип повернення та вхідні аргументи?
Fivell

@Fivell, для всього ARG імен, а НЕ типів: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Це принаймні на Pg 9.6. Ви можете отримати числовий код типу через властивість proargtypes, але вам потрібно буде з'єднатись з якоюсь іншою таблицею, щоб отримати це як імена.
Таліс К.


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
Tim Child

2
[42809] ПОМИЛКА: "array_agg" - це сукупна функція
Daniel L. VanDenBosch

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

Ви врятували мені життя ... pg_get_functiondef () можна використовувати для пошуку програм із конкретним словом у визначенніpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Нуль

0

Ви також можете отримати phpPgAdmin, якщо ви налаштували його у вашій системі,

Крок 1: Виберіть базу даних

Крок 2: Натисніть кнопку пошуку

Крок 3: Змініть параметр пошуку на функції та натисніть кнопку Знайти.

Ви отримаєте список визначених функцій. Ви також можете шукати функції за назвою, сподіваюся, що ця відповідь допоможе іншим.


-1

Щоб побачити повний код (запит), записаний у збереженій процедурі / функціях, Використовуйте команду нижче:

sp_helptext procedure/function_name

для назви функції та назви процедури не додайте префікс 'dbo.' або 'sys.'.

не додайте дужки в кінці процедури або імені функції, а також не передайте параметри.

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

Використовуйте команду нижче, щоб побачити повний код, написаний для Процедури:

sp_helptext ProcedureName

Використовуйте команду нижче, щоб побачити повний код, написаний для функції:

sp_helptext FunctionName

У sp_helptextpostgresql немає .
GSerg

-2

Зазвичай ви використовуєте додаток менеджера БД, наприклад pgAdmin , перейдіть до об'єкта, який вас цікавить, і клацніть правою кнопкою миші шлях до "сценарію як створити" або подібного.

Ви намагаєтесь це зробити ... без програми управління?


2
Просто командний рядок - немає програми керування. Якщо pgAdmin може це зробити, він повинен використовувати якусь команду - я просто не можу знайти жодної документації про це. Я переглядаю таблиці pg_ *, але, схоже, жодна не виділяється.
darren

Радий, що ти знайшов відповідь, але не впевнений, чому ти ускладнюєш собі життя! Чому б просто не встановити pgAdmin?
annakata

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