jak wyświetlić pełny kod procedury składowanej?


111

Jak wyświetlić procedurę / funkcję składowaną?

Powiedzmy, że mam starą funkcję bez oryginalnej definicji - chcę zobaczyć, co robi w pg / psql, ale nie mogę znaleźć sposobu, aby to zrobić.

używając Postgres w wersji 8.4.1

Odpowiedzi:


19

użyj pgAdmin lub użyj pg_proc, aby uzyskać źródło procedur składowanych. pgAdmin robi to samo.


3
pg_proc to wszystko! Uff, cieszę się, że zaoszczędzili kilka bajtów miejsca, nie nazywając go pg_procedure ... geez. :)
— darren

14
Dość łatwo jest dowiedzieć się, jakich zapytań używa psql do pobierania tych informacji (np. Dla polecenia \ df), uruchamiając psql z parametrem --echo-hidden. Spowoduje to wyświetlenie wszystkich zapytań, które są używane wewnętrznie. pg_proc nie przechowuje pełnej instrukcji CREATE FUNCTION. Możesz użyć pg_get_functiondef (), aby pobrać kompletne źródło.
— a_horse_with_no_name

5
na wypadek, gdyby ktoś był zdezorientowany, gdzie znajduje się ta tabela: pg_catalog -> tabela systemowa -> pg_proc
— Dimitris

242

\df+ <function_name>w psql .


6
Czy jest sposób, aby ładnie to wydrukować? Pytam, ponieważ to sprawia, że ​​jest nieczytelny.
— 12hys

3
Jak dla mnie jest to całkiem wydrukowane. Pamiętaj, jeśli robisz to interaktywnie w psql i wiersze są zawijane, a pager włącza się, możesz wyłączyć zawinięte wiersze, wpisując `` -S '' (tak samo jak `` mniej '' argument wiersza poleceń), a następnie użyj klawiszy strzałek do przewijania na około.
— Jonathan Hartley

10
Aby zapewnić czytelność, przed wyświetleniem definicji funkcji można użyć \x meta-polecenia psql . \xjest również przydatny do przeglądania wyników zapytań zawierających rekordy z długimi ciągami.
— Gulasz

149

\ef <function_name>w psql. Daje to całą funkcję z edytowalnym tekstem.


2
Dokładna odpowiedź. Spowoduje to otwarcie definicji funkcji w edytorze.
— Ponnusamy K

2
To najlepsza odpowiedź! Pokazuje definicję funkcji w czytelny sposób.
— faramka

3
Nie zapomnij wpisać ; <enter>after, aby wykonać bufor.
— pachnący

4
ERROR: more than one function named
— Brian Haak

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

Mówi to obsłudze funkcji, jak wywołać funkcję. Może to być rzeczywisty kod źródłowy funkcji dla języków interpretowanych, symbol łącza, nazwa pliku lub cokolwiek innego, w zależności od konwencji języka implementacji / wywołania


To jest przydatne. Czy istnieje sposób, aby wynik był ładnie wydrukowany?
— Setjmp,

Jest to przydatne, ponieważ nie wymaga psql. Zwróć uwagę, że nazwy funkcji wydają się być zmniejszone.
— Seamus Abshere

@Maxim, czy wiesz, jak wykryć typ zwracany i argumenty wejściowe?
— Fivell

@Fivell, za jedyne param nazw, typów: nie SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. To przynajmniej na str. 9.6. Możesz uzyskać kod numeryczny typu poprzez właściwość proargtypes, ale musisz połączyć z inną tabelą, aby uzyskać to jako nazwy.
— Thalis K.


10

Jeśli ktoś się zastanawia, jak szybko przeszukiwać tabele katalogu i korzystać z pg_get_functiondef()funkcji, oto przykładowe zapytanie:

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>'

Wydaje się, że pg_get_functiondef () nie obsługuje funkcji agregujących zdefiniowanych przez użytkownika. Jak otrzymuję BŁĄD: „histogram” jest funkcją agregującą, gdy wysyłam zapytanie do UDA
— Tim Child

2
[42809] BŁĄD: „array_agg” to funkcja agregująca
— Daniel L. VanDenBosch,

1
@ DanielL.VanDenBosch poprawione (aby po prostu wykluczyć funkcje agregujące)
— msciwoj

Uratowałeś mi życie ... pg_get_functiondef () można użyć do znalezienia procesów z określonym słowem w definicjipg_get_functiondef(p.oid) ilike '%indicator_loss%'
— Zero.

0

Możesz również uzyskać przez phpPgAdmin, jeśli skonfigurowałeś go w swoim systemie,

Krok 1: Wybierz bazę danych

Krok 2: Kliknij przycisk Znajdź

Krok 3: Zmień opcję wyszukiwania na funkcje, a następnie kliknij Znajdź.

Otrzymasz listę zdefiniowanych funkcji. Możesz także wyszukiwać funkcje według nazwy, mam nadzieję, że ta odpowiedź pomoże innym.


-1

Aby zobaczyć pełny kod (zapytanie) zapisane w procedurze / funkcjach składowanych, użyj poniższego polecenia:

sp_helptext procedure/function_name

dla nazwy funkcji i nazwy procedury nie dodawaj przedrostka „dbo”. lub „sys.”.

nie dodawaj nawiasów na końcu procedury lub nazwy funkcji, a także nie przekazuj parametrów.

użyj słowa kluczowego sp_helptext, a następnie podaj nazwę procedury / funkcji.

użyj poniższego polecenia, aby zobaczyć pełny kod napisany dla procedury:

sp_helptext ProcedureName

użyj poniższego polecenia, aby zobaczyć pełny kod napisany dla funkcji:

sp_helptext FunctionName

Nie ma sp_helptextw postgresql.
— GSerg

-2

Zwykle używałbyś aplikacji do zarządzania bazami danych , takiej jak pgAdmin , przejdź do obiektu, który Cię interesuje i kliknij prawym przyciskiem myszy, aby przejść do „skryptu podczas tworzenia” lub podobnego.

Czy próbujesz to zrobić ... bez aplikacji do zarządzania?


2
Tylko wiersz poleceń - bez aplikacji do zarządzania. Jeśli pgAdmin może to zrobić, musi użyć jakiegoś polecenia - po prostu nie mogę znaleźć żadnej dokumentacji na ten temat. Przeglądam tabele pg_ *, ale żadna nie wydaje się wyróżniać.
— darren

Cieszę się, że znalazłeś odpowiedź, ale nie wiesz, dlaczego utrudniasz sobie życie! Dlaczego po prostu nie zainstalować pgAdmin?
— annakata

7
Podczas zdalnego łączenia się z bazą danych w sesji ssh uruchomienie aplikacji zarządzającej nie jest łatwe.
— jutky
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.