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


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.